Está en la página 1de 15

Manual Bsico de Struts

Autor: Javier Antoniucci

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").

Cmo funciona esto en aplicaciones Web?

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)

Y para qu este manual bsico?


Para simplificar el "first touch" y para explicar Struts desde el punto de vista del desarrollo de
aplicaciones Web.
No pretende ser un tutorial, una gua del usuario ni un manual de referencia. Ellos ya se han escrito
y estn disponibles en las direcciones que se mencionan en la seccin "Dnde encuentro ms
info?"

Dnde encuentro ms info?

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

Bsquedas en www.google.com poniendo como primera palabra Struts.

Manual Bsico de Struts


Autor: Javier Antoniucci

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"));
}

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
interaccin con la aplicacin. Estos objetos de negocio sern tpicamente JavaBeans o EJBs de los
que se guardar referencia en la sesin del usuario, que sern modificados desde los Action y que
sern consultados desde las JSPs.
Esta clase de objetos no debiera tener ningn conocimiento de la View.

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:

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);
}
}
}

Manual Bsico de Struts


Autor: Javier Antoniucci

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>
...

4. En web.xml deberemos inclur:


<web-app>
...
<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>

<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
...
</web-app>

5. En las JSPs donde utilicemos la internacionalizacin deberemos incluir al comienzo:


...
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
...

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>

3. Declarar el ActionForm en struts-config.xml agregando en /struts-config/form-beans el tag


<form-bean name="nombreForm" type="paquete.clase"/> y en la
declaracin del Action (ver la seccin Controller / Action Beans) agregar los atributos
name="nombreForm", scope="(request session)", e
input="paginaForm.jsp". Ejemplo:
<struts-config>
...
<form-beans>
...
<form-bean name="logonForm" type="com.empresa.aplicacion.LogonForm"/>
...
</form-beans>
...
<action-mappings>
...
<action path="/logon" type="com.empresa.aplicacion.LogonAction"
name="logonForm"
scope="request" input="/logon.jsp">
...
</action>
...
<action-mappings>
...
</struts-config>

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>

</taglib>) y en la JSP donde se utilizar (<%@ taglib uri="nobreTagLib"


prefix="prefijoTagLib" %>). Finalmente, el Tag que se usa en la JSP consiste en
<prefijoTagLib:nombreTag atributo=valor ... >. Para ms info, ver la pgina
oficial de Sun sobre TagLibraries en http://java.sun.com/products/jsp/taglibraries.html.
La funcionalidad de los Tags includos en Struts se encuentran documentados en:

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

Manual Bsico de Struts


Autor: Javier Antoniucci

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>

En este caso, cuando la solicitud sea "/logoff" el Controller llamar a LogoffAction y si


esta retorna un ActionForward con valor success entonces ejecutar /index.jsp. Pero...
qu pasa si es una accin asociada a un formulario? La respuesta es un poco ms compleja:
se debe definir un Form Bean, un Action Mapping con el Form Bean asociado y el
o los forwards necesarios. Por ejemplo:
<struts-config>
...
<form-beans>
...
<form-bean name="logonForm" type="com.empresa.aplicacion.LogonForm"/>
...
</form-beans>
...
<global-forwards>

...

<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.

Cuando un usuario completa un formulario y lo enva, el Controller busca en el scope especificado


el ActionForm Bean correspondiente (todo esto configurado en el struts-config.xml) y si no lo
encuentra lo crea. Luego realiza un set por cada input del form y finalmente llama al mtodo
validate. Si ste retornara uno o ms errores, el Controller llamara a la JSP del formulario para
que sta lo volviera a generar (con los valores establecidos por el usuario) e incluyera el o los
mensajes de error correspondientes. Si todo estuviese bien, llamara al mtodo perform del
Action (tambin configurado en el struts-config.xml) pasndole el ActionForm Bean como
parmetro para que sea utilizado para obtener los valores de los datos.
Si bien el ActionForm tienen caractersticas que corresponden al Model, los ActionForm
pertenecen a la View. Justamente uno de estos puntos comunes es la validacin de datos y a fines de
evitar la duplicacin de funcionalidad, si un desde un ActionForm debe realizar controles de
validacin que se hubiesen implementado en un objeto de negocio entonces se debera utilizar una
instancia de ste para efectuarlos. Ejemplo:
public final class ClienteForm extends ActionForm {
private String nombre = null;
ActionErrors errors = null;
Cliente cliente = null;
...
public ClienteForm() {
...
// Crear u obtener el objeto como sea...
cliente = new Cliente();
errors = new ActionErrors;
...
}
public String getNombre() {
return (this.nombre);
}

public void setNombre(String nombre) {


try {
cliente.setNombre(nombre);
} catch (Exception e) {
errors.add("nombre", new ActionError("error.nombre"));
}
this.nombre = nombre;
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
this.nombre = null;
}
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request)
{

...
return errors;

}
}

Al momento de escribir un ActionForm debemos tener en mente los siguientes principios:

No debe tener nada que corresponda a la lgica de negocio


No debera tener ms que implementaciones de getters y setters (obligatoriamente un par por
cada input del form; si el input se llama nombre entonces tendremos getNombre() y
setNombre(String nombre)), y de los mtodos reset y validate
Debe ser un Firewall entre el usuario y el Action que detenga todo tipo de errores de
incompletitud o inconsistencia
Si el formulario se desarrolla en varias pginas (por ejemplo, en las interfaces de tipo
"Wizard"/"Asistentes") el ActionForm y el Action debern ser los mismos, lo que permitir,
entre otras cosas, que los input se puedan reorganizar en distintas pginas sin cambiar los
ActionForm ni los Action

Manual Bsico de Struts


Autor: Javier Antoniucci

Cmo pongo en funcionamiento Struts?

Cmo pongo en funcionamiento Struts?


Como todo framework, Struts consiste en una librera de clases y una serie de configuraciones por
lo que su instalacin es muy similar en todos los servidores de aplicaciones que provean (o puedan
agregrsele) soporte de:

Java Development Kit (version 1.2 or posterior)


Servlet Container (version 2.2 or posterior)
JavaServer Pages (JSP) (version 1.1 o posterior)
XML Parser compatible con Java API for XML Parsing (JAXP) specification, 1.1 o
posterior
JDBC 2.0 Optional Package Classes

La instalacin consiste en:


1. Obtener la distribucin binaria desde http://jakarta.apache.org/struts/index.html#Acquiring y
descomprimirla
2. Copiar lib/commons-*.jar (clases comunes de Jakarta), lib/struts.jar (JAR de las clases
Struts) y lib/struts-*.tld (Tag Library Descriptors de los Tags de Struts) en el directorio
WEB-INF/lib de la aplicacin
3. Modificar el WEB-INF/web.xml de la aplicacin para incluir un elemento "<servlet>"
que define el Servlet del Controller y un "<servlet-mapping>" que establezca las
peticiones que ste atiende. Por ejemplo:
<web-app>
...
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>application</param-name>
<param-value>com.empresa.aplicacion.ApplicationResources</paramvalue>
</init-param>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>validate</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>2</load-on-startup>

</servlet>
...
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
...
</web-app>

Nota: com.empresa.aplicacion.ApplicationResources es la localizacin del


archivo ".properties" del idioma principal de la aplicacin
4. Modificar el WEB-INF/web.xml de la aplicacin para incluir la definicin de los
TagLibraries. Por ejemplo:
<web-app>
...
<taglib>
<taglib-uri>strutsBean</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>strutsHtml</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>strutsLogic </taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
<display-name></display-name>
<description></description>
...
</web-app>

5. Agregar la definicin de las TagLibraries en las JSPs que se utilicen. Ejemplo:


<%@ taglib uri="strutsBean" prefix="bean" %>
<%@ taglib uri="strutsHtml" prefix="html" %>
<%@ taglib uri="strutsLogic" prefix="logic" %>

6. Crear un struts-config.xml donde se configure el Controller segn se describi en las


secciones anteriores.
Si bien estn comenzando a surgir aplicaciones que gestionan la configuracin de Struts en forma
visual (Camino, StrutsConsole, etc.) es muy recomendable familiarizarse primero con la
configuracin manual antes de utilizar estas herramientas

También podría gustarte