Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manual Basico de Struts
Manual Basico de Struts
Introducción
¿Qué es Struts?
Es un framework que implementa el patrón de arquitectura MVC en Java
Un framework es la extensión de un lenguaje mediante una o más jerarquías de clases que
implementan una funcionalidad y que (opcionalmente) pueden ser extendidas. El framework puede
involucrar TagLibraries.
El patrón de arquitectura MVC (Model-View-Controller) es un patrón que define la organización
independiente del Model (Objetos de Negocio), la View (interfaz con el usuario u otro sistema) y el
Controller (controlador del workflow de la aplicación: "si estoy aquí y me piden esto entonces hacer
tal cosa, si sale bien mostrar esto y sino lo aquello otro").
¿Cómo 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 configuración que se le ha programado en su
XML y llamar al Action correspondiente pasándole los parámetros enviados. El Action instanciará
y/o utilizará los objetos de negocio para concretar la tarea. Según el resultado que retorne el Action,
el Controller derivará la generación de interfaz a una o más JSPs, las cuales podrán consultar los
objetos del Model a fines de realizar su tarea.
¿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 básico?
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 guía del usuario ni un manual de referencia. Ellos ya se han escrito
y están disponibles en las direcciones que se mencionan en la sección "¿Dónde encuentro más
info?"
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:
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 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
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"));
}
}
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);
}
}
}
Manual Básico de Struts
Autor: Javier Antoniucci
• View
• Intro
• Internacionalización
• Forms
• Tags
View
Intro
La View comprende las JSP (principalmente) y los servlets involucrados en la generación de la
interfaz de usuario o con otros Sistemas. Struts provee soporte para construir aplicaciones multi-
idioma, interacción con formularios y otras utilidades mediante la utilización de Tags especiales
(TagLibraries).
Internacionalización
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 aplicación (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 código ISO de idioma (ej: MiAplicación_en.properties).
3. En struts-config.xml se debe configurar el Tag /servlet/init-param/param-name application
y ponerle como param-value la localización 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>
...
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á según el idioma del
usuario. Ejemplo
...
<TITLE><bean:message key="application.title"/></TITLE>
...
Por defecto Struts asigna a cada usuario el idioma principal de la aplicación. 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 aplicación
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 serán el string del
país e idioma a establecer.
Además de texto podran incluirse variables (al igual que se hace en los println) y hasta formato de
datos. Para más información ver la documentación 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 aplicación insume mucho trabajo (aunque en
realidad no lo merezcan) es la interacción con formularios, ya sea para editar u obtener nueva
información. Las comprobaciones, la gestión de errores, el volver a presentarle el mismo form al
usuario con los valores que puso y los mensajes de error y un largo etcétera están soportadas por
Struts a fines de hacernos la vida un poco más fácil.
La idea es la siguiente: todo el trabajo de comprobaciones y generación de mensajes de error se
implementa en los ActionForm y todo el trabajo de generación de interfaz en la/s JSP.
Veamos la receta:
1. Crear el ActionForm (ver la sección Model / ActionForm Beans)
2. Crear la página JSP del formulario utilizando los Tags que provee Struts (ver la sección
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
Básicamente, un Tag de JSP consiste en un Tag con formato <prefijoTagLib:nombreTag
atributo=valor ... > que cuando la JSP se compila es sustituído por una llamada a la clase
TagHandler que se encarga de resolver su funcionalidad.
El TagHandler extiende BodyTagSupport o TagSupport (según si es un tag que tiene body),
que implementa su funcionalidad en los métodos doStartTag(),
doEndTag(),doInitBody(), doAfterBody() (los dos últimos sólo en las que extienden
BodyTagSupport), además de los getters y setters correspondientes a sus atributos. Esta clase se
define en un Tag Library Definition (archivo xml con extensión TLD donde se define el nombre del
tag, la clase TagHandler que lo atiende, la definición 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> <taglib-
location>/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 más info, ver la página
oficial de Sun sobre TagLibraries en http://java.sun.com/products/jsp/taglibraries.html.
La funcionalidad de los Tags incluídos 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 están documentadas en:
• html: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/html/package-
summary.html
• bean: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/bean/package-
summary.html
• logic: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/logic/package-
summary.html
• nested: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/nested/package-
summary.html
Manual Básico de Struts
Autor: Javier Antoniucci
• Controller
• Intro
• ActionForm Beans
Controller
Intro
El Controller comprende la funcionalidad involucrada desde que un usuario genera un estímulo
(click en un link, envío 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
lógica de negocio y según el resultado de la misma ejecutará la JSP que deba generar la interfaz
resultante.
Struts incluye un servlet que a partir de la configuración de struts-config.xml recibe las solicitudes
del usuario, llama al Action Bean que corresponda y, según 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 sección
"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 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 métodos get y set
para cada una de los inputs de un form de una página, y los métodos validate y reset.
<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>