Model
Intro
El Model comprende todos los Objetos de Negocio donde se implementa la lógica de negocio (el "how it's done") y donde se debe soportar todos los requisitos funcionales del Sistema sin mezclarlo con partes correspondientes al workflow (el "what to do") que corresponden al Controller.
Action Bean
Generalmente, los Action Beans siempre realizan las siguientes acciones:
- Obtener los valores necesarios del Action Form, JavaBean, request, session o de donde sea.
- Llamar a los objetos de negocio del Model.
- Analizar los resultados, y según los mismos retornar el ActionForward correspondiente.
Veamos entonces un ejemplo de Action Bean:
public final class LogonAction extends Action {
public ActionForward perform(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
// Obteniendo atributos
Locale locale = getLocale(request);
MessageResources messages = getResources();
User user = null;
// Validando los parámetros
ActionErrors errors = new ActionErrors();
String username = ((LogonForm) form).getUsername();
String password = ((LogonForm) form).getPassword();
try {
DataSource dataSource = servlet.findDataSource(null);
Connection myConnection = dataSource.getConnection();
} catch (SQLException e) {
errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.database.missing"));
saveErrors(request, errors);
return (new ActionForward(mapping.getInput()));
}
UserFactory userFactory = new UserFactory(database);
user = userFactory.getUser(username, password);
if (user == null) {
errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.password.mismatch"));
saveErrors(request, errors);
return (new ActionForward(mapping.getInput()));
}
// Guardando el usuario en la sesion
HttpSession session = request.getSession();
session.setAttribute(Constants.USER_KEY, user);
// Eliminando el form bean obsoleto
if (mapping.getAttribute() != null) {
if ("request".equals(mapping.getScope()))
request.removeAttribute(mapping.getAttribute());
else
session.removeAttribute(mapping.getAttribute());
}
// Pasando el control a la siguiente página
return (mapping.findForward("success"));
}
}
System State Beans
Los System State Beans son el conjunto de objetos de negocio que representan el estado actual del sistema, por ejemplo: el carrito de la compra que el usuario va modificando a lo largo de su interacción con la aplicación. Estos objetos de negocio serán típicamente JavaBeans o EJBs de los que se guardará referencia en la sesión del usuario, que serán modificados desde los Action y que serán consultados desde las JSPs.
Esta clase de objetos no debiera tener ningún conocimiento de la View.
BusinessLogic Beans
Los objetos de negocio son los que implementan la lógica de negocio, el cómo hacer las cosas y su propia persistencia. Estos objetos de negocio no debiera tener ningún conocimiento de la View o el Controller de forma que debieran ser perfectamente reutilizables para implementar soporte a distintas interfaces y hasta para incluirse en nuevas aplicaciones.
Accediendo a BD
Con Struts se puede definir un datasource para una aplicación desde el struts-config.xml (más información en la sección "The Action Mappings Configuration File" del "Struts User Manual"). Este datasource nos permite obtener una connection desde un Action y desde allí utilizarlo o pasarlo al Model. Muy práctico.
Este es un ejemplo de acceso a una conexión desde un Action:
public ActionForward perform(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
javax.sql.DataSource dataSource;
java.sql.Connection myConnection;
...
try {
dataSource = servlet.findDataSource(null);
myConnection = dataSource.getConnection();
...
} catch (SQLException sqle) {
getServlet().log("Connection.process", sqle);
} finally {
...
try {
myConnection.close();
} catch (SQLException e) {
getServlet().log("Connection.close", e);
}
}
}