Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manualbasicodestruts
Manualbasicodestruts
Introduccin
Qu es Struts?
Cmo funciona esto en aplicaciones Web?
Para qu sirve?
Licencia?
Y para qu este manual bsico?
Dnde encuentro ms info?
Introduccin
Qu es Struts?
Es un framework que implementa el patrn de arquitectura MVC en Java
Un framework es la extensin de un lenguaje mediante una o ms jerarquas de clases que
implementan una funcionalidad y que (opcionalmente) pueden ser extendidas. El framework puede
involucrar TagLibraries.
El patrn de arquitectura MVC (Model-View-Controller) es un patrn que define la organizacin
independiente del Model (Objetos de Negocio), la View (interfaz con el usuario u otro sistema) y el
Controller (controlador del workflow de la aplicacin: "si estoy aqu y me piden esto entonces hacer
tal cosa, si sale bien mostrar esto y sino lo aquello otro").
El navegador genera una solicitud que es atendida por el Controller (un Servlet especializado). El
mismo se encarga de analizar la solicitud, seguir la configuracin que se le ha programado en su
XML y llamar al Action correspondiente pasndole los parmetros enviados. El Action instanciar
y/o utilizar los objetos de negocio para concretar la tarea. Segn el resultado que retorne el Action,
el Controller derivar la generacin de interfaz a una o ms JSPs, las cuales podrn consultar los
objetos del Model a fines de realizar su tarea.
Para qu sirve?
Evidentemente, como todo framework intenta, simplifica notablemente la implementacin de una
arquitectura segn el patrn MVC. El mismo separa muy bien lo que es la gestin del workflow de
la aplicacin, del modelo de objetos de negocio y de la generacin de interfaz.
El controlador ya se encuentra implementado por Struts, aunque si fuera necesario se puede heredar
y ampliar o modificar, y el workflow de la aplicacin se puede programar desde un archivo XML
Las acciones que se ejecutarn sobre el modelo de objetos de negocio se implementan basndose en
clases predefinidas por el framework y siguiendo el patrn Facade. Y la generacin de interfaz se
soporta mediante un conjunto de Tags predefinidos por Struts cuyo objetivo es evitar el uso de
Scriplets (los trozos de cdigo Java entre "<%" y "%>"), lo cual genera ventajas de mantenibilidad
y de perfomance (pooling de Tags, caching, etc).
Logsticamente, separa claramente el desarrollo de interfaz del workflow y lgica de negocio
permitiendo desarrollar ambas en paralelo o con personal especializado.
Tambin es evidente que potencia la reutilizacin, soporte de mltiples interfaces de usuario (Html,
sHtml, Wml, Desktop applications, etc.) y de mltiples idiomas, localismos, etc.
Licencia?
Struts est disponible bajo la licencia "free-to-use-license" de la Apache Software Foundation (ver
http://www.apache.org/LICENSE-1.1)
http://jakarta.apache.org/struts
http://jakarta.apache.org/struts/userGuide
http://jakarta.apache.org/struts/api/index.html
http://jguru.com/faq/Struts
http://jguru.com/forums/Struts
http://jakarta.apache.org/struts/#Involved
Model
Intro
Action Bean
System State Beans
BusinessLogic Beans
Accediendo a BD
Model
Intro
El Model comprende todos los Objetos de Negocio donde se implementa la lgica 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:
1. Obtener los valores necesarios del Action Form, JavaBean, request, session o de
donde sea.
2. Llamar a los objetos de negocio del Model.
3. Analizar los resultados, y segn 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 parmetros
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 pgina
return (mapping.findForward("success"));
}
BusinessLogic Beans
Los objetos de negocio son los que implementan la lgica de negocio, el cmo hacer las cosas y su
propia persistencia. Estos objetos de negocio no debiera tener ningn 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 aplicacin desde el struts-config.xml (ms
informacin en la seccin "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 prctico.
Este es un ejemplo de acceso a una conexin desde un Action:
View
Intro
Internacionalizacin
Forms
Tags
View
Intro
La View comprende las JSP (principalmente) y los servlets involucrados en la generacin de la
interfaz de usuario o con otros Sistemas. Struts provee soporte para construir aplicaciones multiidioma, interaccin con formularios y otras utilidades mediante la utilizacin de Tags especiales
(TagLibraries).
Internacionalizacin
Lo podemos abreviar en la siguiente receta:
1. Crear un archivo de texto (ej: MiAplicacion.properties) en el directorio donde se encuentren
las clases de la aplicacin (ej: d:\com\empresa\aplicacion) donde se contengan las claves y
valores con el formato clave.subclave=texto de los textos que pertenezcan al idioma
principal. Ejemplo:
...
application.title= Demo de Struts en APLICACION
index.header=Bienvenido a la Demo de Struts en APLICACION
...
2. Para cada idioma alternativo se crear un archivo nuevo que se llame igual pero que termine
en "_xx.properties" siendo xx el cdigo ISO de idioma (ej: MiAplicacin_en.properties).
3. En struts-config.xml se debe configurar el Tag /servlet/init-param/param-name application
y ponerle como param-value la localizacin del archivo con el idioma principal. Ejemplo:
<servlet>
<servlet-name>action</servlet-name>
...
<init-param>
<param-name>application</param-name>
<param-value>com.empresa.aplicacion.MiAplicacion</param-value>
</init-param>
...
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
...
</web-app>
para declarar que utilizaremos la TagLibrary struts-bean con el prefijo bean y definida
en /WEB-INF/struts-bean.tld
6. Y finalmente, utilizaremos el Tag <bean:message key="clave.subclave"/>
donde clave y subclave corresponden al texto por el que se reemplazar segn el idioma del
usuario. Ejemplo
...
<TITLE><bean:message key="application.title"/></TITLE>
...
Por defecto Struts asigna a cada usuario el idioma principal de la aplicacin. Si se utiliza el tag
<html:html locale="true"> (reemplaza a "<html>" y debe cerrarse con
"</html:html>") entonces se utilizar el primero de los idiomas soportados por la aplicacin
que se encuentre en el header "Accept-Language" enviado por su navegador. Pero si se desea
proponerle al usuario una lista de idiomas entonces ste podr cambiarse mediante
session.setAttribute( Action.LOCALE_KEY, new
java.util.Locale(country, language)) donde country y language sern el string del
pas e idioma a establecer.
Adems de texto podran incluirse variables (al igual que se hace en los println) y hasta formato de
datos. Para ms informacin ver la documentacin oficial de Sun disponible en
http://java.sun.com/j2se/1.3/docs/guide/intl/
Forms
Una de las tareas que durante el desarrollo de una aplicacin insume mucho trabajo (aunque en
realidad no lo merezcan) es la interaccin con formularios, ya sea para editar u obtener nueva
informacin. Las comprobaciones, la gestin de errores, el volver a presentarle el mismo form al
usuario con los valores que puso y los mensajes de error y un largo etctera estn soportadas por
Struts a fines de hacernos la vida un poco ms fcil.
La idea es la siguiente: todo el trabajo de comprobaciones y generacin de mensajes de error se
implementa en los ActionForm y todo el trabajo de generacin de interfaz en la/s JSP.
Veamos la receta:
1. Crear el ActionForm (ver la seccin Model / ActionForm Beans)
2. Crear la pgina JSP del formulario utilizando los Tags que provee Struts (ver la seccin
View / Tags). Ejemplo:
...
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
...
<html:html>
...
<html:form action="/logon" focus="username">
...
<h1><bean:message key="logon.header"/></h1>
<html:form action="/logon" focus="username">
<h5><html:errors/></h5>
<h3><bean:message key="logon.mainText"/></h3>
<p><bean:message key="logon.username"/>
<html:text property="username" size="16" maxlength="16"/></p>
<p><bean:message key="logon.password"/>
<html:password property="password" size="16" maxlength="16"
redisplay=false/></p>
<p><html:submit property="submit" value="Submit"/></p>
<p><html:reset/></p>
...
</html:form>
...
</html:html>
Tags
Bsicamente, un Tag de JSP consiste en un Tag con formato <prefijoTagLib:nombreTag
atributo=valor ... > que cuando la JSP se compila es sustitudo por una llamada a la clase
TagHandler que se encarga de resolver su funcionalidad.
El TagHandler extiende BodyTagSupport o TagSupport (segn si es un tag que tiene body),
que implementa su funcionalidad en los mtodos doStartTag(),
doEndTag(),doInitBody(), doAfterBody() (los dos ltimos slo en las que extienden
BodyTagSupport), adems de los getters y setters correspondientes a sus atributos. Esta clase se
define en un Tag Library Definition (archivo xml con extensin TLD donde se define el nombre del
tag, la clase TagHandler que lo atiende, la definicin de sus atributos, si tiene body, etc.) que a su
vez se debe declarar en el web.xml (dentro de <web-app> se pone <taglib> <taglib-uri>
nombreTagLib </taglib-uri> <tagliblocation>/directorios/nombreArchivo.tld </taglib-location>
html: http://jakarta.apache.org/struts/struts-html.html
bean: http://jakarta.apache.org/struts/struts-bean.html
logic: http://jakarta.apache.org/struts/struts-logic.html
nested: http://jakarta.apache.org/struts/struts-nested.html
Las clases TagHandlers que implementan dicha funcionalidad estn documentadas en:
html: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/html/packagesummary.html
bean: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/bean/packagesummary.html
logic: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/logic/packagesummary.html
nested: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/nested/packagesummary.html
Controller
Intro
ActionForm Beans
Controller
Intro
El Controller comprende la funcionalidad involucrada desde que un usuario genera un estmulo
(click en un link, envo de un formulario, etc.) hasta que se genera la interfaz de respuesta. Entre
medio, llamar a los objetos de negocio del Model para que resuelvan funcionalidad propia de la
lgica de negocio y segn el resultado de la misma ejecutar la JSP que deba generar la interfaz
resultante.
Struts incluye un servlet que a partir de la configuracin de struts-config.xml recibe las solicitudes
del usuario, llama al Action Bean que corresponda y, segn lo que ste retorne, ejecuta una JSP. Por
consiguiente, las tareas que se deben realizar son:
1. Escribir una clase Action que extienda de org.apache.action.Action. Ver seccin
"Controller Action Bean".
2. Configurar el struts-config.xml para que incluya el nuevo action mapping y sus posibles
forwards de salida. Por ejemplo:
<struts-config>
...
<action-mappings>
...
<action path="/logoff" type="com.empresa.aplicacion.LogoffAction">
<forward name="success" path="/index.jsp"/>
</action>
...
</action-mappings>
...
</struts-config>
...
<forward
name="success" path="/mainMenu.do"/>
...
</global-forwards>
...
<action-mappings>
...
<action path="/logon" type="com.empresa.aplicacion.LogonAction"
name="logonForm" scope="request" input="/logon.jsp"> </action>
...
</action-mappings>
...
</struts-config>
En este caso se ha definido un global-forward que, como su nombre lo indica, viene a ser un
forward que se aplica a todos los action-mappings (excepto que se re-defina para alguno en
particular).
3. Incluir los links (preferentemente utilizando <html:link>) o forms (necesariamente
utilizando <html:form>) necesarios en las JSPs correspondientes.
ActionForm Beans
Los ActionForm Beans son clases que extienden ActionForm y que implementan mtodos get y set
para cada una de los inputs de un form de una pgina, y los mtodos validate y reset.
...
return errors;
}
}
</servlet>
...
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
...
</web-app>