Está en la página 1de 30

Jakarta Struts Framework

Contenido

Patrn de diseo MVC El framework Apache Struts


l l

l l

Instalacin Flujo de control en Struts Procesamiento de peticiones Control de errores Manejo de Formularios Libreras de etiquetas de Struts Internacionalizacin

Ejemplo de aplicacin Struts

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

Modelos de desarrollo de aplicaciones web en Java

Los servlets son buenos ejecutando lgica de negocio, pero no son tan buenos presentando informacin JSPs son muy buenos presentando pero psimos introduciendo lgica programtica en ellos La combinacin Servlet/JSPs es lo ms comn hoy en da en el desarrollo de aplicaciones web Dos arquitecturas:
l l

Model-1.5: JSPs para presentacin y control y JavaBeans para la lgica Model-2: Model-View-Controller = JavaBeans-JSPsServlets

MVC es tan comn que se han desarrollado varias infraestructuras en torno a este patrn de diseo:
l l

Apache Struts Java Server Faces

Arquitectura Model 1.5

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

Arquitectura Model 2

Modelo MVC

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

Implementacin MVC en Java

El Controlador (Controller)
l

Servlet central recibe peticiones, procesa URL recibida y delega procesamiento a JavaBeans Servlet guarda resultado de procesamiento realizado por JavaBeans en el contexto de la peticin, la sesin o la aplicacin Servlet transfiere control a un JSP que lleva a cabo la presentacin de resultados

Implementacin MVC en Java

El Modelo (Model)
JavaBeans (o EJBs para aplicaciones ms escalables) juegan el rol de modelo:

Algunos beans ejecutan lgica Otros guardan datos Servlet controlador invoca un mtodo en bean lgico y ste devuelve un bean de datos Autor de JSP tiene acceso a bean de datos

Normalmente:
1.

2.

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

Implementacin MVC en Java

La Vista (View)
l l

Rol ejecutado por JSPs Servlet Controlador transfiere control al JSP despus de haber guardado en un contexto el resultado en forma de un bean de datos JSP usa jsp:useBean y jsp:getProperty para recuperar datos y formatear respuesta en HTML o XML

Implementacin MVC en Java

En resumen:
l l l

Los beans (o EJBs) ejecutan la lgica de negocio y guardan los resultados Los JSPs proveen la informacin formateada Los servlets coordinan/controlan la ejecucin de los beans y los JSPs

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

Qu son los Frameworks?

Los frameworks pueden ser vistos como implementaciones de patrones de diseo que facilitan la reutilizacin de diseo y cdigo Dado que MVC ha sido utilizado en muchas aplicaciones web, el desarrollo de frameworks que den soporte a reas comunes en todas las aplicaciones MVC es necesario Aplicaciones basadas en Struts consistirn de:
l l l

Apache Struts es una de estas frameworks

Cdigo Java Deployment descriptors que configuran el framework para el uso de nuestra aplicacin

Apache Jakarta Struts

Implementacin del modelo 2/patrn de diseo MVC que facilita la creacin de aplicaciones web en Java Creada por Craig McClanahan y donada a la Apache Software Foundation en el 2000 (pertenece a Apache Jakarta)

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

Qu proporciona Struts?

Un servlet (ActionServlet) que acta como controlador MVC totalmente configurable Clases base que son extendidas para implementar la lgica de la aplicacin web:
l l

Un rico conjunto de etiquetas personalizadas JSP que cooperan con el controlador para su uso en la capa view de MVC Varias opciones para la validacin de entrada de usuario en formularios HTML: ActionForm o Validator Framework Mecanismos para el manejo y reporte de errores Soporte para la internacionalizacin (i18n) a travs de ficheros de recursos y Java Locales Soporte para fuentes de datos Y ms ..

Struts Action Struts ActionForm

Documentacin y ejemplos de Struts

En el directorio webapps de la distribucin de Struts 1.1 se pueden encontrar varios ficheros .war muy tiles:
l

struts-documentation.war

En el subdirectorio api/index.html se puede encontrar JavaDoc de Struts API Si se ejecuta esta aplicacin web en http://localhost:8080/struts-documentation/ se puede tambin obtener informacin detallada sobre el uso de Struts struts-example.war struts-blank.war base para la creacin de cualquier aplicacin que use Struts etc.

Ejemplos de uso de Struts:


PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

Flujo de Control en Struts I

Flujo de Control en Struts II

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

Flujo de control en Struts III

La clase org.apache.struts.action.ActionServlet es el eje de Struts. Dada una peticin de entrada HTTP:


l l l

El fichero de configuracin web.xml contiene los url mappings para enviar las peticiones de llegada al ActionServlet, mientras que el fichero de configuracin de Struts struts-config.xml contiene los mappings a acciones Los form beans creados por ActionServlet deben ser implementados por el programador, extendiendo org.apache.struts.action.ActionForm.
l

Crea un objeto ActionForm donde guarda y valida los parmetros de entrada Decide que objeto Action se debe invocar y le pasa el objeto ActionForm creado Transfiere control a la siguiente etapa de procesamiento de la peticin (tpicamente un JSP).

Los objetos Action invocados deben ser desarrollados por el programador y extienden org.apache.struts.action.Action. Tienen un mtodo execute() o (perform() en Struts 1.0) que ejecuta la lgica de negocio La accin devuelve un objeto ActionForward al servlet que especifica el siguiente paso a ejecutar, normalmente se transfiere el control a un JSP para que visualice los resultados.

El programador deber definir un conjunto de getters y setter y sobreescribir los mtodos validate() y reset()

Pasos a seguir en el desarrollo de una aplicacin en Struts


Disea la aplicacin en trminos de las acciones, vistas y estados del modelo Aade las libreras Java de Struts y los .tlds de sus etiquetas personalizadas a tu proyecto Configura tu web.xml para que enve peticiones HTTP al ActionServet Configura el ActionServlet definiendo elementos <actionmappings> y <form-beans> en struts-config.xml Define tus clases Action Define tus clases ActionForm Define clases adicionales Java representando la lgica de negocio Define tus pginas de presentacin JSP Explotar la aplicacin La aplicacin ejemplo suministrada con Struts, strutsblank.war, es normalmente un buen punto de partida para desarrollar una nueva aplicacin usando Struts

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

Actions en Struts

Se crea una accin extendiendo la clase org.apache.struts.action.Action El ActionServlet ejecuta acciones invocando el mtodo execute() tu clase Action
l

Dentro del mtodo execute() tienes acceso a:


l l l l l

El mtodo execute() contiene cdigo para manipular el modelo

El mtodo execute() devuelve un objeto ActionForward que indica al ActionServlet a dnde transferir el control a continuacin

Cabeceras y parmetros de peticiones HTTP Atributos/beans guardados en los contextos application/session/request scope Struts ActionForm asociados con la accin (opcional) El ActionMapping associado a esta accin (opcional) El objeto httpResponse

Form Beans

Un ActionForm es un JavaBean con propiedades que corresponden a los controles de un formulario HTML. Los parmetros son mapeados a propiedades del bean.
l l

El programador define un form bean extendiendo la clase org.apache.struts.action.ActionForm (o de forma declarativa usando org.apache.struts.action.DynaActionForm) Hay que definir cada una de las propiedades en la clase y escribir los getters/setters correspondientes, siguiendo las reglas de JavaBeans Despus de escribir el cdigo del form bean, es necesario asociarlo con una o ms acciones a travs del fichero de configuracin de Struts struts-config.xml Cada vez que se llama a la accin , el ActionServlet poblar las propiedades con los valores de los parmetros recibidos en el formulario HTML Las propiedades no slo pueden ser escalares sino que tambin pueden ser colecciones de valores

Proveen un mecanismo de buffer/validate/convert que necesitamos para asegurarnos que el usuario introduce los datos esperados Acta como puente entre el navegador y el objeto de negocio

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

10

Por qu se necesitan Forms Beans?


Por qu no simplemente se accede a los parmetros de una peticin, en vez de usar un form bean como intermediario? Razones:
l

Los Form beans pueden ser validados antes de que una accin sea invocada
Si la propiedad validate de un elemento Action en el fichero struts-config.xml contiene el valor true (por defecto), el mtodo validate ser invocado

Si un form bean falla en la validacin puede hacer que Struts enve al usuario de vuelta a la vista (JSP) desde la que se realiz el POST en primer lugar, junto con un mensaje de error

Los form beans pueden ser usados por mltiples acciones o incluso una aplicacin completa

Es importante asignar a la propiedad input del elemento action en struts-config.xml una referencia a la vista que entreg el formulario

Si se configura al ActionController para que guarde un form bean en el contexto de sesin se permitir el uso del form bean en todas las peticiones web que llegan a la aplicacin

Dynamic Action Forms


Son ActionForms creados de manera declarativa en strutsconfig.xml Una o varias propiedades dinmicas pueden ser pasadas a una instancia de org.apache.struts.action.DynaActionForm

<form-bean name=checkoutForm type=org.apache.struts.action.DynaActionForm> <form-property name=firstName type=java.lang.String/> <form-property name=lastName type=java.lang.String/> <form-property name=age type=java.lang.Integer initial=18/> </form-bean>

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

11

Recursos de String/Manejo de Errores

Recursos de String
l

Manejo de errores
l

Todos los strings usados en mensajes en JSPs tanto de datos de aplicacin como de errores puedes ser colocados en un ficheros de recursos (ApplicationResources.properties) Struts proporciona etiquetas personalizadas JSP tags para acceder a estos recursos <bean:message key="prompt.goodguess.heading"/> Se recomienda que el manejo de errores se lleve a cabo dentro del mtodo execute() y el control se transfiera a la vista apropiada Struts proporciona un mecanismo separado para permitir la implementacin de un manejador global de excepciones Struts proporciona etiquetas JSP que ayudan en la visualizacin de los errores en tu JSP: <html:errors property=passphrase/>
errors.add("passphrase",new ActionError("error.passphrase.required"));

l l

Internationalization i18n

Struts soporta internacionalizacin a travs de ficheros de recursos, sus libreras de etiquetas personalizadas y Java Locales Se pueden definir strings a visualizar en tu fichero de recursos, y luego ser usados en tus JSPs Los strings del idioma por defecto se guardan en el fichero ApplicationResources.properties Otros ficheros de recursos adicionales pueden ser definidos que incluyen el idioma a usar en el nombre del fichero.
l

Ejemplo:

Los navegadores envan la cabecera HTTP Accept-Language en cada peticin que indica cul es el idioma preferido por el usuario Los ficheros de recursos deben colocarse en un lugar accesible desde el CLASSPATH de la aplicacin web, por ejemplo, debajo del directorio WEB-INF/classes

ApplicationResources_eu.properties (Contiene mensajes en Euskera) ApplicationResources_es.properties (Contiene mensajes en Castellano) Para cambiar el idioma preferido en IE: Tools Internet Options Languages

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

12

Ejemplo web.xml de aplicacin usando Struts


<web-app> <!-- Action Servlet Configuration --> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servletclass> <init-param> <param-name>application</param-name> <param-value> com.develop.ejsp.struts.resources.ApplicationResources </param-value> </init-param> <init-param> <! etc. --> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- Action Servlet Mapping --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>

Configurando Struts

Como en todo framework se minimiza el cdigo Java a escribir y se maximiza la configuracin a travs de ficheros XML
l l

Struts se configura a travs struts-config.xml Ledo por el framework cuando arranca Fuentes de datos (data-sources) Form beans, variaciones de JavaBeans.

Contiene:
l l

Ejecutan una peticin basado en una entrega de un formulario. Son poblados por el controlador con los datos del formulario Llevan a cabo validacin de datos Son procesados por objetos Action

l l

Global forwards y ActionMappings

Mapean el nombre de una accin a un objeto Action

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

13

Ejemplo struts-config.xml I
<struts-config> <data-sources> <data-source> <set-property property= "autoCommit" value="false"/> <set-property property= "description" value="MessageBoard"/> <set-property property= "driverClass" value="..SQLServerDriver"/> <set-property property= "maxCount" value="4"/> <set-property property= "minCount" value="2"/> <set-property property="password" value=""/> <set-property property= "url"value="someurl"/> <set-property property= "user" value="someuser"/> </data-source> </data-sources> <!-- === Form Bean Definitions === --> <form-beans> <form-bean name="SigninForm" type= "com.develop.ejsp.struts.beans.SigninForm"/> </form-beans> <!-- === Global Forward Definitions === --> <global-forwards> <forward name="signin" path="/signin.jsp"/> </global-forwards>

Ejemplo struts-config.xml II
<!-- === Action Mapping Definitions === --> <action-mappings> <!-- Process a user logon --> <action path="/SigninAction type= "com.develop.ejsp.struts.actions.SigninAction name="SigninForm" scope="session input="/signin.jsp"> <forward name="succeeded" path="/groups.jsp"/> <forward name="failed" path="/groups.jsp"/> </action> <action path="/GotoReplyToAction type= "com.develop.ejsp.struts.actions.GotoMessageAction"> <forward name="succeeded" path="/newmessage.jsp"/> <forward name="failed" path="/groups.jsp"/> </action> </action-mappings> </struts-config>

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

14

Procesamiento de una peticin en Struts I

Si el cliente enva la peticin:


l

http://server/app/GotoReplyToAction.do

El ActionServlet de Struts quita la extensin (.do) y mira la accin correspondiente en el fichero de configuracin Struts para la accin GotoReplyToAction Si la encuentra encontrar o crear una instancia del tipo (type) indicado: com.develop.ejsp.struts.actions.GotoMessageAction El mtodo perform() en Struts 1.0 (o execute() en Struts 1.1 y sucesivos) ser invocado en el objeto GotoMessageAction:
l

Este es el lugar donde la lgica de negocio de la peticin es ejecutada

Procesamiento de peticin en Struts II


public class GotoMessageAction extends org.apache.struts.action.Action { public ActionForward execute( ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // lots of code omitted for clarity, but here the // business logic should be implemented ActionForward af = mapping.findForward("succeeded"); return af; }

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

15

Procesamiento de peticin en Struts III

De los cuatro parmetros recibidos en execute(), ActionMapping y ActionForm son especficos a Struts El objeto ActionMapping contiene informacin de configuracin proveniente de struts-config.xml file. El objeto ActionForm contiene el bean del formulario que fue inicializado por el ActionServlet al procesar la peticin

Procesamiento de peticin en Struts IV

En el mapeo de la accin GotoReplyToAction hay dos posibles forward definidos:


l l

Si el mtodo execute() se completa sin errores el mtodo ActionMapping.findForward() es llamado, pasando el nombre del siguiente recurso a llamar.
l l

Uno con el nombre "succeeded" y otro "failed

El mtodo findForward() devuelve un objeto ActionForward que es pasado al ActionServlet El objeto ActionForward contiene detalles de a dnde debera el ActionServlet enviar la peticin (contiene el path del JSP que va a visualizar los resultados)

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

16

Manejo de errores en Struts I


Struts define la clase ActionErrors que mantiene una coleccin de objetos ActionError. ActionErrors errors = new ActionErrors(); errors.add (ActionErrors.GLOBAL_ERROR, new ActionError("error.signing.connect")); saveErrors(request,errors); return (new ActionForward (mapping.findForward(failed"))); El cdigo aade un slo objeto ActionError a la coleccin, pero si se llevase a cabo validacin de los campos de un formulario varios errores podran ser mostrados. Luego devuelve una instancia de ActionForward que redirige a "failed". El ActionServlet guardar en el objeto request el objeto ActionErrors bajo un nombre bien conocido por Struts: request.setAttribute( Action.ERROR_KEY, errors); Este objeto ActionErrors es ahora disponible a cualquier pgina o accin consecutiva. La pgina JSP failed anterior debera tener un rea donde se mostrasen los errores producidos. El string usado para construir un objeto ActionError no es un mensaje de error sino que un identificador de un recurso (i18n Struts)

Manejo de errores en Struts II


public class GotoMessageAction extends org.apache.struts.action.Action { public ActionForward execute(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { ActionErrors errors = new ActionErrors(); try { // business logic omitted for clarity } catch(SQLException e) { errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.sqlerror")); } if (!errors.empty()) { saveErrors(request, errors); ActionForward af = mapping.findForward("failed"); return af; } request.setAttribute(Message.MESSAGE_NAME, message); ActionForward af = mapping.findForward("succeeded"); return af;

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

17

Manejo de Formularios I

La otra accin definida en el fichero de configuracin de Struts era: <action path="/SigninAction" type="com.develop.ejsp.struts. actions.SigninAction" name="SigninForm" scope="session" input="/signin.jsp"> <forward name="succeeded" path="/groups.jsp"/> <forward name="failed" path="/groups.jsp"/> </action> Esta accin est asociada con el formulario llamado SigningForm, tambin definido en el fichero de configuracin: <form-beans> <form-bean name="SigninForm" type="com.develop.ejsp.struts. beans.SigninForm"/> </form-beans>

Manejo de Formularios II

Si una accin tiene un formulario asociado a ella (atributo name en action mapping), el ActionServlet crea un form bean Todo form bean hereda de org.apache.struts.action.ActionForm , que es un JavaBean serializable. Dos mtodos en ActionForm pueden ser sobreescritos:
l l

validate() y reset()

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

18

Manejo de Formularios III


public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); if ((username == null) || (username.length() < 1)) errors.add ("username", new ActionError("error.username.required")); if ((password == null) || (password.length() < 1)) errors.add("password", new ActionError("error.password.required")); return errors; } El FormBean es poblado por el ActionServlet con los parmetros de la peticin de entrada llamando a los mtodos setXXX() correspondientes. Una vez poblado, el form bean es validado:
l

Si el objeto ActionErrors devuelto es null o vaco significa que la validacin tuvo xito y una instancia del form bean creado, en este caso SigningForm, es pasado al objeto SigningAction Si la validacin falla, la peticin ser re-direccionada por Struts a la pgina que contena el formulario inicialmente el formulario, dada por el atributo input del elemento action en struts-config.xml

Manejo de Formularios IV
public class SigninForm extends ActionForm { String userName = null; String password = null; public SigninForm() {} public void setUsername(String userName) { this.userName = userName; } public String getUserName() { return this.userName; } public void setPassword(String password) { this.password = password; } public String getPassword() { return this.password; } ...

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

19

Manejo de Formularios V
public ActionErrors validate(ActionMapping actionMapping, HttpServletRequest httpServletRequest) { ActionErrors errors = new ActionErrors(); if ((password == null) || (password.length() < 1)) errors.add("password", new ActionError("error.password.required")); if ((userName == null) || (userName.length() < 1)) errors.add("username", new ActionError("error.username.required")); return errors; } public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest) { username = ""; password=""; }

Manejo de Formularios VI
public class SigninAction extends org.apache.struts.action.Action { public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { try { String username = ((SigninForm) form). getUserName(); String password = ((SigninForm) form). getPassword(); // etc. }

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

20

DataSources en Struts
try { DataSource ds = servlet.findDataSource(null); message = new Message(); message.getMessage(ds, request.getParameter( Message.MESSAGE_ID)), request.getParameter( GROUP_ID_NAME)) } El cdigo arriba muestra otra caracterstica de Struts, la habilidad de configurar y usar referencias a javax.jdbc.DataSources El extracto de struts-config.xml anteriormente mostrado tiene una seccin <data-sources> para configurar las data sources de la aplicacin. Struts provee las clases GenericDataSource y GenericConnection que son wrappers sobre los objetos JDBC Connections y DataSources definidos en el fichero de configuracin.

Struts Tag Libraries


Documentadas en http://www.onjava.com/lpt/a/4034 La framework Struts proporciona un conjunto de 6 libreras de etiquetas, que asisten en la tarea de la creacin de la vista de MVC para evitar incluir cdigo Java en los JSPs:
l l l l l l

Bean Tags HTML Tags Logic Tags Nested Tags Template Tags Tiles Tags

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

21

HTML Tags

Estas etiquetas son principalmente usadas para:


l l

Algunas de las acciones ms tiles son:


l l l l l l l

Crear formularios de entrada de datos y Otras utilidades para visualizar interfaces basados en HTML.

base genera un elemento HTML <base> errors condicionalmente visualiza un conjunto acumulado de mensajes de error form define un formulario de entrada text visualiza un campo de entrada de tipo texto messages condicionalmente visualiza un conjunto de mensajes acumulados submit visualiza un botn de entrega Etc.

Logic Tags

Usadas para:
l l l

Iterar sobre colecciones Generacin condicional de salida, y Flujo de aplicacin present genera el contenido de marcado dentro de esta etiqueta si el valor indicado es encontrado en esta peticin notPresent lo opuesto a present iterate repite el contenido anidado dentro de esta etiqueta al iterar sobre una coleccin forward transfiere control a la pgina especificada por la entrada ActionForward. Etc.

Algunas de las acciones ms tiles son:


l

l l l l

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

22

Tiles Tags (Framework)


La librera de etiquetas Tiles es un super-conjunto de la librera Templates Intenta evitar la duplicacin de contenido de lenguaje de marcado dentro de una aplicacin web con respecto al look-and-feel de un portal:
l

Tiles reduce el tamao de cdigo redundante en una aplicacin web y separa el contenido de la visualizacin del mismo de manera ms eficiente
l

Un mecanismo normalmente utilizado es usar la directiva jsp:include para aadir cabeceras/mens y pies de pginas a un portal web

Su objetivo principal es evitar en los JSPs contenido de marcado que corresponda con el look-and-feel del portal factoriza este marcado, de tal manera que la modificacin del layout sea sencilla y eficiente

Tiles define Layout Managers para JSPs

Mi primera aplicacin con Apache Struts

Aplicacin para llevar a cabo login


l l

Una vez que el usuario ha hecho login las pginas cambian para indicar tal circunstancia Consiste de dos pantallas: Pgina Welcome que saluda al usuario y ofrece enlaces a la aplicacin Pgina Logon que permite al usuario introducir username y password
l

Esta pgina lleva a cabo la validacin que los datos introducidos son correctos

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

23

Welcome.html
<HTML> <HEAD> <TITLE>Welcome World!!</TITLE> <base href="http://localhost:8080/logon/pages/Welcome.js p"> </HEAD> <BODY> <H3>Welcome World!</H3> <UL> <LI><a href="/logon/logon.do">Sign in</a></LI> </UL> <IMG src='struts-power.gif' alt='Powered by Struts'> </BODY> </HTML>

Welcome.jsp I
<%@ taglib uri="/tags/struts-bean" prefix="bean" %> <%@ taglib uri="/tags/struts-html" prefix="html" %> <%@ taglib uri="/tags/struts-logic" prefix="logic" %> <HTML> <HEAD> <TITLE>Welcome World!!</TITLE> <html:base/> </HEAD> <BODY> <logic:present name="user"> <H3>Welcome <bean:write name="user" property="username"/>!</H3> </logic:present> <logic:notPresent scope="session" name="user"> <H3>Welcome World!</H3> </logic:notPresent> <html:errors/> <UL> <LI><html:link forward="logon">Sign in</html:link></LI> <logic:present name="user"> <LI><html:link forward="logoff">Sign out</html:link></LI> </logic:present> </UL> <IMG src='struts-power.gif' alt='Powered by Struts'> </BODY> </HTML>

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

24

Welcome.jsp II
<html:base/> garantiza que referencias a imgenes o otros recursos son relativas a la localizacin del JSP <logic:present name="user"> <H3>Welcome <bean:write name="user" property="username"/>!</H3> </logic:present> Esta etiqueta personalizada asegura que el usuario solamente es saludado si ha efectuado login <logic:notPresent> tiene el comportamiento opuesto <LI><html:link forward="logon">Sign in</html:link></LI> Struts reescribe automticamente los enlaces para mantener la sesin del usuario. Tambin permite dar a los enlaces un nombre lgico y luego guardar los enlaces reales en un fichero de configuracin.

Logon.html
<HTML> <HEAD> <TITLE>Sign in, Please!</TITLE> </HEAD> <BODY> <form name="logonForm" method="POST" action="/logon/LogonSubmit.do"> <TABLE border="0" width="100%"> <TR> <TH align="right">Username:</TH> <TD align="left"><input type="text" name="username" value=""></TD> </TR> <TR> <TH align="right">Password:</TH> <TD align="left"><input type="password" name="password" value=""></TD> </TR> <TR> <TD align="right"><input type="submit" name="submit" value="Submit"></TD> <TD align="left"><input type="reset" name="reset" value="Reset"></TD> </TR> </TABLE> </form> <script language="JavaScript" type="text/javascript"> <!-document.forms["logonForm"].elements["username"].focus() // --> </script> </BODY> </HTML>

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

25

Logon.jsp I
<%@ taglib uri="/tags/struts-html" prefix="html" %> <HTML> <HEAD> <TITLE>Sign in, Please!</TITLE> </HEAD> <BODY> <html:errors/> <html:form action="/LogonSubmit" focus="username"> <TABLE border="0" width="100%"> <TR> <TH align="right">Username:</TH> <TD align="left"><html:text property="username"/></TD> </TR> <TR> <TH align="right">Password:</TH> <TD align="left"><html:password property="password"/></TD> </TR> <TR> <TD align="right"><html:submit/></TD> <TD align="left"><html:reset/></TD> </TR> </TABLE> </html:form> </BODY> </HTML>

Logon.jsp II
<%@ taglib uri="/tags/struts-html" prefix="html"%> La librera de etiquetas html definida por Struts es disponible a la pgina <html:errors/> garantiza si ha habido algn error durante el login, que estos errores sean visualizados <html:form action="/LogonSubmit" focus="username"> Produce un formulario HTML para la entrada de datos. Tambin genera JavaScript para mover el cursor al campo username del formulario
l

La propiedad action hace referencia a un componente ActionMapping en el fichero de configuracin de Struts dice al formulario que JavaBean (derivado de ActionForm) debe usar para poblar los controles de HTML.

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

26

Logon.jsp III
<html:text property="username"/> Crea un control de entrada HTML para un campo de texto. Asignar a este campo la propiedad username del JavaBean de ayuda antes mencionado. <html:password> crea un campo de entrada <html:submit> y <html:reset> generan botones HTML Submit y Reset. Dos objetos sern invocados cuando se usen estos botones:
l l

ActionForm Action

Configuracin de la accin logon I

Configuracin para la pantalla de logon:


l l

JSP hace referencia al /LogonSubmit ActionMapping ActionMapping hace referencia a los objetos:

app.LogonForm describe propiedades usadas por el formulario logon app.LogonAction lleva a cabo el procesamiento del formulario

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

27

Configuracin de la accin logon II


<html:form action="/LogonSubmit" focus="username"> La configuracin asociada al atributo accin en Struts sera: <action path="/LogonSubmit" type="app.LogonAction" name="logonForm" scope="request" validate="true" input="/pages/Logon.jsp"/> path identicador nico para el mapping type accin a invocar cuando el formulario es entregado name el helper JavaBean (ActionForm) a usarse con el formulario HTML scope indica en qu contexto debe guardarse el ActionForm validate indica si es necesario invocar al mtodo validate del ActionForm antes de invocar al objeto Action input indica a donde ir si validate devuelve falso <form-bean name="logonForm" type="app.LogonForm"/> Este extracto del fichero de configuracin relaciona el nombre lgico logonForm con la clase app.LogonForm

LogonForm: un ejemplo de un ActionForm


public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); if ((username == null) || (username.length() < 1)) errors.add ("username", new ActionError("error.username.required")); if ((password == null) || (password.length() < 1)) errors.add("password", new ActionError("error.password.required")); return errors; } Si validate no devuelve null, entonces el ActionController servlet guardar el objeto ActionErrors devuelto en el contexto request, bajo una clave conocida por la etiqueta html:errors Los tokens error.username.required y error.password.required son claves que son utilizadas para mirar los strings correspondientes en el fichero de recursos de Struts
l

Recordar que cada Locale contiene su propio fichero de recursos lo que hace que los mensajes sean fcilmente localizables.

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

28

LogonAction: un ejemplo de un LogonAction I


package app; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionError; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionServlet; public final class LogonAction extends Action { // Validate credentials with business tier public boolean isUserLogon (String username, String password) throws UserDirectoryException { return (UserDirectory.getInstance().isValidPassword(username,passw ord)); } // end isUserLogon

LogonAction: un ejemplo de un LogonAction II


public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // Obtain username and password from web tier String username = ((LogonForm) form).getUsername(); String password = ((LogonForm) form).getPassword(); // Validate credentials boolean validated = false; try { validated = isUserLogon(username,password); } catch (UserDirectoryException ude) { // couldn't connect to user directory ActionErrors errors = new ActionErrors(); errors.add (ActionErrors.GLOBAL_ERROR, new ActionError("error.logon.connect")); saveErrors(request,errors); // return to input page return (new ActionForward (mapping.getInput())); } // Save our logged-in user in the session, because we use it again later. HttpSession session = request.getSession(); session.setAttribute(Constants.USER_KEY, form); // Log this event, if appropriate if (servlet.getDebug() >= Constants.DEBUG) { StringBuffer message = new StringBuffer("LogonAction: User '"); message.append(username); message.append("' logged on in session "); message.append(session.getId()); servlet.log(message.toString); } // Return success return (mapping.findForward (Constants.WELCOME)); } // end perform } // end LogonAction

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

29

LogonAction: un ejemplo de un LogonAction III


// Validate credentials boolean validated = false; try { validated = isUserLogon(username,password); } catch (UserDirectoryException ude) { // couldn't connect to user directory ActionErrors errors = new ActionErrors(); errors.add (ActionErrors.GLOBAL_ERROR, new ActionError("error.logon.connect")); saveErrors(request,errors); // return to input page return (new ActionForward(mapping.getInput())); } Si un error es encontrado mientras se lleva a cabo la validacin de la entrada del usuario y una excepcin es lanzada, entonces el error es transformado en un ActionError y el control es devuelto a la pgina de entrada. Lo mismo se lleva a cabo si se puede contactar al servicio de directorio pero el login del usuario no es correcto return (mapping.findForward (Constants.WELCOME)); Un objeto de tipo ActionForward ser devuelto al ActionServlet si todo va bien. En este caso se enva control al forward success declarado en el fichero de configuracin como: <forward name=success path=/pages/Welcome.jsp/>

Referencias

l l l

URLs
http://jakarta.apache.org/Struts http://theserverside.com http://paginaspersonales.deusto.es/dipina/ Pgina de Diego Lpez de Ipia.

l l l

Libros
Programming Jakarta Struts de OReilly Mastering Tomcat Development de WILEY Java Server Programming J2EE Edition de Wrox

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

30

También podría gustarte