You are on page 1of 30

Jakarta Struts Framework

Contenido
¡ ¡

Patrón de diseño MVC El framework Apache Struts
l l

l l

Instalación Flujo de control en Struts ¡ Procesamiento de peticiones ¡ Control de errores ¡ Manejo de Formularios Librerías de etiquetas de Struts Internacionalización

¡

Ejemplo de aplicación Struts

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

1

Modelos de desarrollo de aplicaciones web en Java
¡

¡ ¡ ¡

Los servlets son buenos ejecutando lógica de negocio, pero no son tan buenos presentando información JSPs son muy buenos presentando pero pésimos introduciendo lógica programática en ellos La combinación Servlet/JSPs es lo más común hoy en día en el desarrollo de aplicaciones web Dos arquitecturas:
l l

Model-1.5: JSPs para presentación y control y JavaBeans para la lógica Model-2: Model-View-Controller = JavaBeans-JSPsServlets
¡

MVC es tan común que se han desarrollado varias infraestructuras en torno a este patrón de diseño:
l l

Apache Struts Java Server Faces

Arquitectura Model 1.5

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

2

Arquitectura Model 2

Modelo MVC

PDF Creator - PDF4Free v2.0

http://www.pdf4free.com

3

procesa URL recibida y delega procesamiento a JavaBeans Servlet guarda resultado de procesamiento realizado por JavaBeans en el contexto de la petición. PDF Creator .pdf4free. la sesión o la aplicación Servlet transfiere control a un JSP que lleva a cabo la presentación de resultados Implementación MVC en Java ¡ l El Modelo (Model) JavaBeans (o EJBs para aplicaciones más escalables) juegan el rol de modelo: ¡ ¡ Algunos beans ejecutan lógica Otros guardan datos Servlet controlador invoca un método en bean lógico y éste devuelve un bean de datos Autor de JSP tiene acceso a bean de datos l Normalmente: 1.0 http://www.com 4 .PDF4Free v2.Implementación MVC en Java ¡ El Controlador (Controller) l l l Servlet central recibe peticiones. 2.

pdf4free.Implementación MVC en Java ¡ La Vista (View) l l l Rol ejecutado por JSPs Servlet Controlador transfiere control al JSP después 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 Implementación MVC en Java ¡ En resumen: l l l Los beans (o EJBs) ejecutan la lógica de negocio y guardan los resultados Los JSPs proveen la información formateada Los servlets coordinan/controlan la ejecución de los beans y los JSPs PDF Creator .com 5 .0 http://www.PDF4Free v2.

pdf4free.¿Qué son los Frameworks? ¡ ¡ Los frameworks pueden ser vistos como implementaciones de patrones de diseño que facilitan la reutilización de diseño y código Dado que MVC ha sido utilizado en muchas aplicaciones web.com 6 . el desarrollo de frameworks que den soporte a áreas comunes en todas las aplicaciones MVC es necesario Aplicaciones basadas en Struts consistirán de: l l l Apache Struts es una de estas frameworks ¡ Código Java Deployment descriptors que configuran el framework para el uso de nuestra aplicación Apache Jakarta Struts ¡ ¡ Implementación del modelo 2/patrón de diseño MVC que facilita la creación 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 .0 http://www.PDF4Free v2.

war muy útiles: l struts-documentation.war ¡ ¡ En el subdirectorio api/index. Struts Action Struts ActionForm Documentación y ejemplos de Struts ¡ En el directorio webapps de la distribución de Struts 1.com 7 . l Ejemplos de uso de Struts: ¡ ¡ ¡ PDF Creator .war struts-blank.pdf4free.1 se pueden encontrar varios ficheros .0 http://www.html se puede encontrar JavaDoc de Struts API Si se ejecuta esta aplicación web en http://localhost:8080/struts-documentation/ se puede también obtener información detallada sobre el uso de Struts struts-example..PDF4Free v2.war à base para la creación de cualquier aplicación que use Struts etc.¿Qué proporciona Struts? ¡ ¡ Un servlet (ActionServlet) que actúa como controlador MVC totalmente configurable Clases base que son extendidas para implementar la lógica de la aplicación 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 validación de entrada de usuario en formularios HTML: ActionForm o Validator Framework Mecanismos para el manejo y reporte de errores Soporte para la internacionalización (i18n) a través de ficheros de recursos y Java Locales Soporte para fuentes de datos Y más ….

0 http://www.PDF4Free v2.pdf4free.Flujo de Control en Struts I Flujo de Control en Struts II PDF Creator .com 8 .

0) que ejecuta la lógica de negocio La acción devuelve un objeto ActionForward al servlet que especifica el siguiente paso a ejecutar.tlds de sus etiquetas personalizadas a tu proyecto Configura tu web.Flujo de control en Struts III ¡ La clase org.ActionForm.ActionServlet es el eje de Struts.PDF4Free v2.xml Define tus clases Action Define tus clases ActionForm Define clases adicionales Java representando la lógica de negocio Define tus páginas de presentación JSP Explotar la aplicación La aplicación ejemplo suministrada con Struts.apache. es normalmente un buen punto de partida para desarrollar una nueva aplicación usando Struts PDF Creator .xml para que envíe peticiones HTTP al ActionServet Configura el ActionServlet definiendo elementos <actionmappings> y <form-beans> en struts-config. l Crea un objeto ActionForm donde guarda y valida los parámetros 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 petición (típicamente un JSP).struts. El programador deberá definir un conjunto de getters y setter y sobreescribir los métodos validate() y reset() Pasos a seguir en el desarrollo de una aplicación en Struts ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ Diseña la aplicación en términos de las acciones.war.xml contiene los mappings a acciones Los form beans creados por ActionServlet deben ser implementados por el programador.0 http://www.com 9 .Action.action. ¡ ¡ Los objetos Action invocados deben ser desarrollados por el programador y extienden org. mientras que el fichero de configuración de Struts struts-config.pdf4free. extendiendo org. Dada una petición de entrada HTTP: l l l ¡ ¡ El fichero de configuración web. vistas y estados del modelo Añade las librerías Java de Struts y los .action.struts.apache. normalmente se transfiere el control a un JSP para que visualice los resultados.apache.struts.action. strutsblank.xml contiene los url mappings para enviar las peticiones de llegada al ActionServlet. Tienen un método execute() o (perform() en Struts 1.

l l ¡ ¡ ¡ ¡ ¡ El programador define un form bean extendiendo la clase org.action. es necesario asociarlo con una o más acciones a través del fichero de configuración de Struts struts-config.struts.ActionForm (o de forma declarativa usando org. el ActionServlet poblará las propiedades con los valores de los parámetros recibidos en el formulario HTML Las propiedades no sólo pueden ser escalares sino que también pueden ser colecciones de valores Proveen un mecanismo de buffer/validate/convert que necesitamos para asegurarnos que el usuario introduce los datos esperados Actúa como puente entre el navegador y el objeto de negocio PDF Creator .action.Actions en Struts ¡ ¡ Se crea una acción extendiendo la clase org.xml Cada vez que se llama a la acción . Los parámetros son mapeados a propiedades del bean.struts.action.PDF4Free v2. siguiendo las reglas de JavaBeans Después de escribir el código del form bean.struts.pdf4free.0 http://www.apache.com 10 .Action El ActionServlet ejecuta acciones invocando el método execute() tu clase Action l ¡ Dentro del método execute() tienes acceso a: l l l l l El método execute() contiene código para manipular el modelo ¡ El método execute() devuelve un objeto ActionForward que indica al ActionServlet a dónde transferir el control a continuación Cabeceras y parámetros de peticiones HTTP Atributos/beans guardados en los contextos application/session/request scope Struts ActionForm asociados con la acción (opcional) El ActionMapping associado a esta acción (opcional) El objeto httpResponse Form Beans ¡ Un ActionForm es un JavaBean con propiedades que corresponden a los controles de un formulario HTML.apache.apache.DynaActionForm) Hay que definir cada una de las propiedades en la clase y escribir los getters/setters correspondientes.

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 sesión se permitirá el uso del form bean en todas las peticiones web que llegan a la aplicación Dynamic Action Forms ¡ ¡ Son ActionForms creados de manera declarativa en strutsconfig.pdf4free.action.apache.String”/> <form-property name=“lastName” type=“java.xml Una o varias propiedades dinámicas pueden ser pasadas a una instancia de org.action.struts.DynaActionForm <form-bean name=“checkoutForm” type=“org.com 11 .¿Por qué se necesitan Forms Beans? ¡ ¡ ¿Por qué no simplemente se accede a los parámetros de una petición.lang. en vez de usar un form bean como intermediario? Razones: l ¡ Los Form beans pueden ser validados antes de que una acción sea invocada Si la propiedad validate de un elemento Action en el fichero struts-config.DynaActionForm”> <form-property name=“firstName” type=“java.PDF4Free v2. junto con un mensaje de error ¡ l Los form beans pueden ser usados por múltiples acciones o incluso una aplicación completa ¡ Es importante asignar a la propiedad input del elemento action en struts-config.xml contiene el valor true (por defecto).lang. el método validate será invocado l Si un form bean falla en la validación puede hacer que Struts envíe al usuario de vuelta a la vista (JSP) desde la que se realizó el POST en primer lugar.String”/> <form-property name=“age” type=“java.lang.struts.apache.Integer” initial=“18”/> </form-bean> PDF Creator .0 http://www.

properties) Struts proporciona etiquetas personalizadas JSP tags para acceder a estos recursos <bean:message key="prompt. l l Internationalization i18n ¡ ¡ ¡ ¡ Struts soporta internacionalización a través de ficheros de recursos. y luego ser usados en tus JSPs Los strings del idioma por defecto se guardan en el fichero ApplicationResources.heading"/> Se recomienda que el manejo de errores se lleve a cabo dentro del método execute() y el control se transfiera a la vista apropiada Struts proporciona un mecanismo separado para permitir la implementación de un manejador global de excepciones Struts proporciona etiquetas JSP que ayudan en la visualización de los errores en tu JSP: <html:errors property=“passphrase”/> errors.com 12 .properties Otros ficheros de recursos adicionales pueden ser definidos que incluyen el idioma a usar en el nombre del fichero.PDF4Free v2.pdf4free.required")).properties (Contiene mensajes en Euskera) ApplicationResources_es.new ActionError("error.Recursos de String/Manejo de Errores ¡ Recursos de String l l ¡ Manejo de errores l Todos los strings usados en mensajes en JSPs tanto de datos de aplicación como de errores puedes ser colocados en un ficheros de recursos (ApplicationResources.0 http://www. por ejemplo.goodguess. l Ejemplo: ¡ ¡ ¡ ¡ ¡ Los navegadores envían la cabecera HTTP Accept-Language en cada petición que indica cuál es el idioma preferido por el usuario Los ficheros de recursos deben colocarse en un lugar accesible desde el CLASSPATH de la aplicación web.passphrase. debajo del directorio WEB-INF/classes ApplicationResources_eu.properties (Contiene mensajes en Castellano) Para cambiar el idioma preferido en IE: Toolsà Internet Optionsà Languages PDF Creator . sus librerías de etiquetas personalizadas y Java Locales Se pueden definir strings a visualizar en tu fichero de recursos.add("passphrase".

do</url-pattern> </servlet-mapping> </web-app> Configurando Struts ¡ Como en todo framework se minimiza el código Java a escribir y se maximiza la configuración a través de ficheros XML l l Struts se configura a través struts-config.struts.PDF4Free v2.Ejemplo web.apache. ¡ ¡ Contiene: l l ¡ ¡ ¡ Ejecutan una petición basado en una entrega de un formulario.develop.resources. Son poblados por el controlador con los datos del formulario Llevan a cabo validación de datos Son procesados por objetos Action l l Global forwards y ActionMappings ¡ Mapean el nombre de una acción a un objeto Action PDF Creator .Action Servlet Mapping --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.pdf4free.xml de aplicación usando Struts <web-app> <!-.ejsp.0 http://www.struts.action. variaciones de JavaBeans. --> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-.ActionServlet</servletclass> <init-param> <param-name>application</param-name> <param-value> com.com 13 .Action Servlet Configuration --> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.ApplicationResources </param-value> </init-param> <init-param> <!– etc.xml Leído por el framework cuando arranca Fuentes de datos (data-sources) Form beans.

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> <!-.actions.Ejemplo struts-config.develop.develop.=== Action Mapping Definitions === --> <action-mappings> <!-.struts.ejsp.ejsp.struts.jsp"/> </action> </action-mappings> </struts-config> PDF Creator ..=== Form Bean Definitions === --> <form-beans> <form-bean name="SigninForm" type= "com.ejsp.0 http://www.beans.PDF4Free v2.jsp"/> </action> <action path="/GotoReplyToAction“ type= "com.Process a user logon --> <action path="/SigninAction“ type= "com.jsp"/> <forward name="failed" path="/groups.xml II <!-.com 14 .develop.GotoMessageAction"> <forward name="succeeded" path="/newmessage.SigninAction“ name="SigninForm" scope="session“ input="/signin.jsp"/> </global-forwards> Ejemplo struts-config.struts.=== Global Forward Definitions === --> <global-forwards> <forward name="signin" path="/signin.SigninForm"/> </form-beans> <!-.pdf4free.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=".jsp"/> <forward name="failed" path="/groups.actions.jsp"> <forward name="succeeded" path="/groups.

0 (o execute() en Struts 1.Action { public ActionForward execute( ActionMapping mapping. ServletException { // lots of code omitted for clarity.ejsp.Procesamiento de una petición en Struts I ¡ Si el cliente envía la petición: l http://server/app/GotoReplyToAction.1 y sucesivos) será invocado en el objeto GotoMessageAction: l Este es el lugar donde la lógica de negocio de la petición es ejecutada Procesamiento de petición en Struts II public class GotoMessageAction extends org. } } PDF Creator .apache. but here the // business logic should be implemented ActionForward af = mapping. HttpServletResponse response) throws IOException.struts.do) y mira la acción correspondiente en el fichero de configuración Struts para la acción GotoReplyToAction Si la encuentra encontrará o creará una instancia del ‘tipo’ (type) indicado: com. HttpServletRequest request.develop.struts.findForward("succeeded").actions.do ¡ ¡ ¡ El ActionServlet de Struts quita la extensión (.GotoMessageAction El método perform() en Struts 1.PDF4Free v2. return af. ActionForm actionForm.0 http://www.action.com 15 .pdf4free.

PDF4Free v2.findForward() es llamado.com 16 .0 http://www.pdf4free. ActionMapping y ActionForm son específicos a Struts El objeto ActionMapping contiene información de configuración proveniente de struts-config. pasando el nombre del siguiente recurso a llamar.Procesamiento de petición en Struts III ¡ ¡ ¡ De los cuatro parámetros recibidos en execute(). l l Uno con el nombre "succeeded" y otro "failed“ El método findForward() devuelve un objeto ActionForward que es pasado al ActionServlet El objeto ActionForward contiene detalles de a dónde debería el ActionServlet enviar la petición (contiene el path del JSP que va a visualizar los resultados) PDF Creator . El objeto ActionForm contiene el bean del formulario que fue inicializado por el ActionServlet al procesar la petición Procesamiento de petición en Struts IV ¡ En el mapeo de la acción GotoReplyToAction hay dos posibles forward definidos: l l ¡ Si el método execute() se completa sin errores el método ActionMapping.xml file.

setAttribute( Action. pero si se llevase a cabo validación de los campos de un formulario varios errores podrían ser mostrados. ¡ Luego devuelve una instancia de ActionForward que redirige a "failed".PDF4Free v2.GLOBAL_ERROR.findForward("succeeded"). ¡ La página JSP “failed” anterior debería tener un área donde se mostrasen los errores producidos.signing. ActionForward af = mapping. HttpServletRequest request. errors. new ActionError("error. ¡ El ActionServlet guardará en el objeto request el objeto ActionErrors bajo un nombre bien conocido por Struts: request. } if (!errors. ServletException { ActionErrors errors = new ActionErrors().add (ActionErrors. try { // business logic omitted for clarity } catch(SQLException e) { errors.connect")).ERROR_KEY.GLOBAL_ERROR.sqlerror")).errors).Manejo de errores en Struts I Struts define la clase ActionErrors que mantiene una colección de objetos ActionError. message).action. ¡ El código añade un sólo objeto ActionError a la colección. errors).Action { public ActionForward execute(ActionMapping mapping.struts. return (new ActionForward (mapping. ActionErrors errors = new ActionErrors().pdf4free. } request.findForward("failed"). ¡ 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.findForward(“failed"))). saveErrors(request. } } PDF Creator .0 http://www.add(ActionErrors.setAttribute(Message. return af. return af.com 17 . ¡ Este objeto ActionErrors es ahora disponible a cualquier página o acción consecutiva. HttpServletResponse response) throws IOException.apache. ActionForm actionForm.MESSAGE_NAME. new ActionError("error. ActionForward af = mapping. errors).empty()) { saveErrors(request.

ejsp.pdf4free.ActionForm .0 http://www.Manejo de Formularios I ¡ ¡ La otra acción definida en el fichero de configuración de Struts era: <action path="/SigninAction" type="com.apache.struts.develop. también definido en el fichero de configuración: <form-beans> <form-bean name="SigninForm" type="com.struts.struts.jsp"> <forward name="succeeded" path="/groups. beans.SigninForm"/> </form-beans> Manejo de Formularios II ¡ ¡ ¡ Si una acción tiene un formulario asociado a ella (atributo name en action mapping). actions.action.PDF4Free v2. que es un JavaBean serializable.SigninAction" name="SigninForm" scope="session" input="/signin.ejsp. el ActionServlet crea un form bean Todo form bean hereda de org.jsp"/> </action> Esta acción está asociada con el formulario llamado SigningForm.jsp"/> <forward name="failed" path="/groups.develop.com 18 . Dos métodos en ActionForm pueden ser sobreescritos: l l validate() y reset() PDF Creator .

} ¡ El FormBean es poblado por el ActionServlet con los parámetros de la petición de entrada llamando a los métodos setXXX() correspondientes.PDF4Free v2.password = password.pdf4free.add("password".userName. return errors. } public String getUserName() { return this. if ((username == null) || (username.com 19 . el form bean es validado: l l Si el objeto ActionErrors devuelto es null o vacío significa que la validación tuvo éxito y una instancia del form bean creado.. } public String getPassword() { return this.0 http://www. ¡ Una vez poblado.required")). dada por el atributo input del elemento action en struts-config.required")). new ActionError("error. la petición será re-direccionada por Struts a la página que contenía el formulario inicialmente el formulario.length() < 1)) errors. String password = null. } . } public void setPassword(String password) { this. HttpServletRequest request) { ActionErrors errors = new ActionErrors().length() < 1)) errors. public SigninForm() {} public void setUsername(String userName) { this. es pasado al objeto SigningAction Si la validación falla.username.xml Manejo de Formularios IV public class SigninForm extends ActionForm { String userName = null.. en este caso SigningForm. PDF Creator .userName = userName.password.password.Manejo de Formularios III public ActionErrors validate(ActionMapping mapping. new ActionError("error. if ((password == null) || (password.add ("username".

} } Manejo de Formularios VI public class SigninAction extends org. getPassword(). if ((password == null) || (password. password="".password. // etc. getUserName(). } public void reset(ActionMapping actionMapping. new ActionError("error. return errors. HttpServletRequest httpServletRequest) { ActionErrors errors = new ActionErrors(). String password = ((SigninForm) form). new ActionError("error.struts.Manejo de Formularios V public ActionErrors validate(ActionMapping actionMapping.action.add("password".add("username".username.Action { public ActionForward perform(ActionMapping mapping.required")). HttpServletRequest request. HttpServletRequest httpServletRequest) { username = "".required")). ActionForm form.pdf4free. if ((userName == null) || (userName. ServletException { try { String username = ((SigninForm) form). HttpServletResponse response) throws IOException.0 http://www.apache.com 20 .length() < 1)) errors.PDF4Free v2.length() < 1)) errors. } } } PDF Creator .

findDataSource(null). message.PDF4Free v2.jdbc.com 21 .xml anteriormente mostrado tiene una sección <data-sources> para configurar las data sources de la aplicación. la habilidad de configurar y usar referencias a javax.com/lpt/a/4034 La framework Struts proporciona un conjunto de 6 librerías de etiquetas. que asisten en la tarea de la creación de la vista de MVC para evitar incluir código Java en los JSPs: l l l l l l Bean Tags HTML Tags Logic Tags Nested Tags Template Tags Tiles Tags PDF Creator .onjava.0 http://www.getParameter( GROUP_ID_NAME)) } ¡ El código arriba muestra otra característica de Struts.getParameter( Message. ¡ Struts provee las clases GenericDataSource y GenericConnection que son wrappers sobre los objetos JDBC Connections y DataSources definidos en el fichero de configuración. Struts Tag Libraries ¡ ¡ Documentadas en http://www.MESSAGE_ID)). message = new Message().getMessage(ds. request.DataSources en Struts try { DataSource ds = servlet.pdf4free.DataSources ¡ El extracto de struts-config. request.

HTML Tags ¡ Estas etiquetas son principalmente usadas para: l l ¡ Algunas de las acciones más útiles son: l l l l l l l Crear formularios de entrada de datos y Otras utilidades para visualizar interfaces basados en HTML. Etc.PDF4Free v2.com 22 . y Flujo de aplicación present à genera el contenido de marcado dentro de esta etiqueta si el valor indicado es encontrado en esta petición notPresent à lo opuesto a present iterate à repite el contenido anidado dentro de esta etiqueta al iterar sobre una colección forward à transfiere control a la página especificada por la entrada ActionForward.pdf4free.0 http://www. Logic Tags ¡ Usadas para: l l l Iterar sobre colecciones Generación condicional de salida. 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 botón de entrega Etc. ¡ Algunas de las acciones más útiles son: l l l l l PDF Creator .

PDF4Free v2.pdf4free.Tiles Tags (Framework) ¡ ¡ La librería de etiquetas Tiles es un super-conjunto de la librería Templates Intenta evitar la duplicación de contenido de lenguaje de marcado dentro de una aplicación web con respecto al look-and-feel de un portal: l ¡ Tiles reduce el tamaño de código redundante en una aplicación web y separa el contenido de la visualización del mismo de manera más eficiente l Un mecanismo normalmente utilizado es usar la directiva jsp:include para añadir cabeceras/menús y pies de páginas 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 modificación del layout sea sencilla y eficiente Tiles define Layout Managers para JSPs Mi primera aplicación con Apache Struts ¡ Aplicación para llevar a cabo login l l Una vez que el usuario ha hecho login las páginas cambian para indicar tal circunstancia Consiste de dos pantallas: ¡ Página Welcome que saluda al usuario y ofrece enlaces a la aplicación ¡ Página Logon que permite al usuario introducir username y password l Esta página lleva a cabo la validación que los datos introducidos son correctos PDF Creator .com 23 .0 http://www.

Welcome.gif' alt='Powered by Struts'> </BODY> </HTML> PDF Creator .gif' alt='Powered by Struts'> </BODY> </HTML> Welcome.do">Sign in</a></LI> </UL> <IMG src='struts-power.com 24 .html <HTML> <HEAD> <TITLE>Welcome World!!</TITLE> <base href="http://localhost:8080/logon/pages/Welcome.PDF4Free v2.0 http://www.pdf4free.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.js p"> </HEAD> <BODY> <H3>Welcome World!</H3> <UL> <LI><a href="/logon/logon.

com 25 .PDF4Free v2.0 http://www.html <HTML> <HEAD> <TITLE>Sign in. Please!</TITLE> </HEAD> <BODY> <form name="logonForm" method="POST" action="/logon/LogonSubmit.pdf4free.Welcome. ¡ Logon.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 .jsp II <html:base/> garantiza que referencias a imágenes o otros recursos son relativas a la localización 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 automáticamente los enlaces para mantener la sesión del usuario. También permite dar a los enlaces un nombre lógico y luego guardar los enlaces reales en un fichero de configuración.

0 http://www.jsp II <%@ taglib uri="/tags/struts-html" prefix="html"%> ¡ La librería de etiquetas html definida por Struts es disponible a la página ¡ <html:errors/> garantiza si ha habido algún error durante el login.com 26 .PDF4Free v2. que estos errores sean visualizados <html:form action="/LogonSubmit" focus="username"> ¡ Produce un formulario HTML para la entrada de datos. 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. También 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 configuración de Struts à dice al formulario que JavaBean (derivado de ActionForm) debe usar para poblar los controles de HTML.Logon. PDF Creator .jsp I <%@ taglib uri="/tags/struts-html" prefix="html" %> <HTML> <HEAD> <TITLE>Sign in.pdf4free.

Logon.PDF4Free v2.com 27 . Asignará a este campo la propiedad username del JavaBean de ayuda antes mencionado.pdf4free.LogonForm à describe propiedades usadas por el formulario logon app.jsp III <html:text property="username"/> ¡ Crea un control de entrada HTML para un campo de texto.0 http://www. Dos objetos serán invocados cuando se usen estos botones: l l ActionForm Action Configuración de la acción logon I ¡ Configuración para la pantalla de logon: l l JSP hace referencia al /LogonSubmit ActionMapping ActionMapping hace referencia a los objetos: ¡ ¡ app.LogonAction à lleva a cabo el procesamiento del formulario PDF Creator . ¡ <html:password> crea un campo de entrada ¡ <html:submit> y <html:reset> generan botones HTML Submit y Reset.

password.required")).username.add ("username".LogonAction" name="logonForm" scope="request" validate="true" input="/pages/Logon.length() < 1)) errors.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 fácilmente localizables. PDF Creator .LogonForm LogonForm: un ejemplo de un ActionForm public ActionErrors validate(ActionMapping mapping. new ActionError("error. bajo una clave conocida por la etiqueta html:errors ¡ Los tokens error.length() < 1)) errors. if ((username == null) || (username.required")). if ((password == null) || (password.add("password". new ActionError("error.Configuración de la acción logon II <html:form action="/LogonSubmit" focus="username"> ¡ La configuración asociada al atributo acción en Struts sería: <action path="/LogonSubmit" type="app.0 http://www.username.LogonForm"/> ¡ Este extracto del fichero de configuración relaciona el nombre lógico logonForm con la clase app.required y error.password. return errors.pdf4free.com 28 . entonces el ActionController servlet guardará el objeto ActionErrors devuelto en el contexto request.PDF4Free v2.jsp"/> ¡ path à identicador único para el mapping ¡ type à acción 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 método validate del ActionForm antes de invocar al objeto Action ¡ input à indica a donde ir si validate devuelve falso <form-bean name="logonForm" type="app. HttpServletRequest request) { ActionErrors errors = new ActionErrors(). } ¡ Si validate no devuelve null.

action.apache.Action.action.append(username). because we use it again later.action.com 29 .DEBUG) { StringBuffer message = new StringBuffer("LogonAction: User '"). // return to input page return (new ActionForward (mapping.struts.action.getPassword(). import org.http.struts.getUsername().setAttribute(Constants.isValidPassword(username.GLOBAL_ERROR. import javax.logon. import java.pdf4free.password). session. servlet.ActionMapping.struts.getId()). ServletException { // Obtain username and password from web tier String username = ((LogonForm) form).HttpServletRequest.servlet. // Validate credentials boolean validated = false.ServletException. HttpServletRequest request.ActionError.passw ord)).apache. ActionForm form.HttpServletResponse.ActionForward.getInstance().apache.apache. import org.struts.servlet.http.append(session. } catch (UserDirectoryException ude) { // couldn't connect to user directory ActionErrors errors = new ActionErrors().ActionErrors.PDF4Free v2.http.apache. try { validated = isUserLogon(username. import org. if appropriate if (servlet.connect")). import org. } // end perform } // end LogonAction PDF Creator .USER_KEY. message.toString). saveErrors(request. message. form).struts.getInput())). errors.LogonAction: un ejemplo de un LogonAction I package app.action.WELCOME)). public final class LogonAction extends Action { // Validate credentials with business tier public boolean isUserLogon (String username.struts.io.log(message.struts. String password = ((LogonForm) form). import javax.action. import javax. new ActionError("error.servlet.servlet.HttpSession.getSession().0 http://www. // Log this event. } // end isUserLogon LogonAction: un ejemplo de un LogonAction II public ActionForward perform(ActionMapping mapping. HttpServletResponse response) throws IOException. import org.action.ActionServlet. } // Save our logged-in user in the session.apache. import javax.append("' logged on in session "). import org. HttpSession session = request.add (ActionErrors.getDebug() >= Constants. import org.IOException.findForward (Constants.ActionForm.errors). } // Return success return (mapping. String password) throws UserDirectoryException { return (UserDirectory.apache. message.

// return to input page return (new ActionForward(mapping.deusto. errors.WELCOME)).GLOBAL_ERROR.org/Struts http://theserverside.getInput())). En este caso se envía control al forward success declarado en el fichero de configuración como: <forward name=“success” path=“/pages/Welcome.errors).PDF4Free v2.LogonAction: un ejemplo de un LogonAction III // Validate credentials boolean validated = false. try { validated = isUserLogon(username. } catch (UserDirectoryException ude) { // couldn't connect to user directory ActionErrors errors = new ActionErrors(). } ¡ Si un error es encontrado mientras se lleva a cabo la validación de la entrada del usuario y una excepción es lanzada. ¡ l l l Libros Programming Jakarta Struts de O’Reilly Mastering Tomcat Development de WILEY Java Server Programming J2EE Edition de Wrox PDF Creator .pdf4free.com 30 .add (ActionErrors.connect")).password).es/dipina/ Página de Diego López de Ipiña.com http://paginaspersonales.jsp”/> Referencias ¡ l l l URLs http://jakarta.apache. new ActionError("error. Lo mismo se lleva a cabo si se puede contactar al servicio de directorio pero el login del usuario no es correcto return (mapping. ¡ Un objeto de tipo ActionForward será devuelto al ActionServlet si todo va bien.logon.0 http://www. entonces el error es transformado en un ActionError y el control es devuelto a la página de entrada.findForward (Constants. saveErrors(request.