Arquitectura J2ee Struts

  • Uploaded by: api-3735749
  • 0
  • 0
  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Arquitectura J2ee Struts as PDF for free.

More details

  • Words: 6,229
  • Pages: 96
Arquitectura WEB Conceptos Avanzados

Objetivos 





Reconocer y Aplicar Arquitectura de Aplicaciones Reconocer Plataformas de Desarrollo empresariales Modelo Vista Controlador

Contenidos  





 

Arquitectura de aplicaciones Web. Plataformas de Desarrollo Empresariales. Arquitecturas J2EE y Plataforma SAP NW. Introducción a la Arquitectura Orientada a Servicios. Modelo Vista Controlador (MVC). Implementación del MVC.

Actividades   

 

Exposición de contenidos. Instalación de IDE para ejercicio Ejercicio laboratorio de “Aplicación del MVC” Definición de grupos de trabajo Especificar Trabajos grupales

Arquitectura de Aplicaciones 

Definición de arquitectura usada por ANSI/IEEE Std 1471-2000: 



 

"Es la organización fundamental de un sistema, incorporada a sus componentes, su relación con cada uno, el medio ambiente, y los principios que lo gobiernan, su diseño y evolución."

Una Arquitectura es una herramienta conceptual que asiste a las organizaciones con el entendimiento de su propia estructura y su manera de trabajar. Provee un mapa de la ruta planeada para el sistema en relación al cambio tecnológico. Los modelos incluyen:   

Objetivos y Metas Procesos y organización Sistemas y datos

Arquitectura de Aplicaciones (2) Diseño de arquitectura de sistema basado en:  Artefactos  Casos de uso  Línea de producto.  Dominios  Patrones

.NET

J2EE

Paralelo .NET / J2EE



Java Application Servers Un Java Application Server (ya denominado Application Server) proporciona el ambiente necesario para ejecutar EJB's y su estructura es la siguiente:



Los dos componentes principales de un Application Server son el "Servlet Engine" (Web-Container) y "Enterprise Bean Engine" (Bean-Container) aunque no sean comercializados como tal. Dentro del "Servlet Container" residen y se ejecutan JSP's y Servlet's, mientras que en el "Enterprise Bean Container" se

Application servers fully J2EE Compliant Existen varios en el mercado. Entre los mas usados:  Sun Application Server (gratuito para desarrolladores)  Apache Tomcat (Open Source - gratuito)  JBoss (Open Source – gratuito)  Oracle 10g Application Server (descarga gratuita)  IBM Websphere (bajo licencia comercial)  BEA WebLogic (bajo licencia comercial)  SAP WAS NW (bajo licencia comercial) 

En estos "Application Servers" no existe una clara distinción (al menos para el programador final) entre el "Servlet Engine" y el "EJB Engine" por lo que la ejecución de componentes se lleva acabo de una manera relativamente transparente. Puede consultar detalles adicionales sobre Servidores de Páginas y de

Herramientas e IDEs J2EE 





 

Independientemente del Application Server que se esté utilizando, seguramente existirá una herramienta que automatiza ciertos pasos de la creación de un EJB. El grado de automatización puede variar desde el "Deployment Descriptor" hasta la creación de WAR's y EAR's. Desde luego presentan una gran ventaja. Por ejemplo: un "Deployment Descriptor" puede contener 100 o 200 líneas de código que puede tomar horas en escribir. Esto puede ser reducido con estas herramientas a unos cuantos minutos al llenar formularios. A pesar de sus ventajas, muchas de estas herramientas ofrecen funcionalidades mínimas. Hoy en día ya existen diversos IDE's ("Integrated Development Environments") que permiten no sólo las tareas anteriores, sino que también agilizan la creación de código fuente para EJB's tales como: creación de Interfases, conexiones hacia Bases de Datos y otras facilidades más.

Algunos IDE's 



    

NetBeans Source Eclipse Source Sun Java Studio Creator JBuilder WebSphere Studio JDeveloper NW Developer Studio

OpenOpenSun Borland IBM Oracle SAP

Arquitectura J2EE

Escenario basado en la web (web-centric application)

Escenario desde un navegador:

modelo de aplicaciones distribuidas en diversas capas o niveles (tier). •Cliente •Intermedia •Sistema Información Empresarial (back end)

Escenario desde una aplicación

Capas de la Arquitectura J2EE  







En la arquitectura JEE se contemplan cuatro capas, en función del tipo de servicio y contenedores: Capa de cliente, también conocida como capa de presentación o de aplicación. Nos encontramos con componentes Java (applets o aplicaciones) y no-Java (HTML, JavaScript, etc.). Capa Web. Intermediario entre el cliente y otras capas. Sus componentes principales son los servlets y las JSP. Aunque componentes de capa cliente (applets o aplicaciones) pueden acceder directamente a la capa EJB, lo normal es que Los servlets/JSPs pueden llamar a los EJB. Capa Enterprise JavaBeans. Permite a múltiples aplicaciones tener acceso de forma concurrente a datos y lógica de negocio. Los EJB se encuentran en un servidor EJB, que no es más que un servidor de objetos distribuidos. Un EJB puede conectarse a cualquier capa, aunque su misión esencial es conectarse con los sistemas de información empresarial (un gestor de base de datos, ERP, etc.) Capa de sistemas de información empresarial.

La visión de la arquitectura es un esquema lógico, no físico

Patrón o Micro arquitectura Modelo-Vista-Controlador (MVC)  Elementos del patrón:  



Modelo: datos y reglas de negocio. Vista: muestra la información del modelo al usuario. Controlador: gestiona las entradas del usuario.

Implementación Web de MVC 

Diagrama de Secuencia:

Pasos:  El usuario introduce el evento.  El Controlador recibe el evento y lo traduce en una petición al Modelo (aunque también puede llamar directamente a la vista).  El modelo (si es necesario) llama a la vista para su actualización.  Para cumplir con la actualización la Vista puede solicitar datos al Modelo.  El Controlador recibe el control.

Ejemplo MVC en J2EE usando STRUTS 



 

Struts es una herramienta de soporte para el desarrollo de aplicaciones Web bajo el patrón MVC bajo la plataforma J2EE (Java 2, Enterprise Edition). Se desarrollaba como parte del proyecto Jakarta de la Apache Software Foundation, pero actualmente es un proyecto independiente conocido como Apache Struts. Struts permite reducir el tiempo de desarrollo. Su carácter de "software libre" y su compatibilidad con todas las plataformas en que Java Entreprise esté disponible, lo

Arquitectura funcional básica

Arquitectura funcional básica (2)

Funcionalidad deseada 

 



Se trata de una aplicación de alta de usuario, un tipo de aplicación muy común y que presenta en muchos sistemas. Implementar con Struts . En cualquier otro entorno bastaría con crear un formulario y una página que realiza el alta y da el mensaje correspondiente; pero aquí no será tan simple. Entrada de aplicación: 

Un formulario de datos:     



username, password, edad, fechanacimiento y profesión

Salida de aplicación :

Diagrama de clases

Diagrama de Colaboración

Referencias en Internet          

http://jakarta.apache.org/struts http://jakarta.apache.org/struts/userGuide http://jakarta.apache.org/struts/#Involved http://jakarta.apache.org/struts/api http://jguru.com/faq/Struts http://jguru.com/forums/Struts http://www-128.ibm.com/developerworks/library/j-struts http://www.programacion.com/java/tutorial/struts/ http://www.programacion.com/java/tutorial/joa_struts/ http://www.monografias.com/trabajos28/struts -el-netbeans4/struts-el-netbeans4.shtml

Apache Jakarta Struts Fuente: Dr. Diego Lz. de Ipiña Gz. de Artaza http://paginaspersonales.deusto.es/dipina http://paginaspersonales.deusto.es/dipina/cursos/J2EECesine.zip [email protected]

Contenido  

Patrón de diseño MVC La framework Apache Struts  

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 Java Server Faces

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: 



Model-1: 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: 

Apache Struts

Arquitectura Model 1

Arquitectura Model 2

Modelo MVC 0

Modelo MVC I 

El Controlador (Controller) 





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 petición, la sesión o la aplicación Servlet transfiere control a un JSP que lleva a cabo la presentación de

Modelo MVC II 

El Modelo (Model) 

JavaBeans (o EJBs para aplicaciones más escalables) desempeña el rol de modelo:  



Algunos beans ejecutan lógica Otros guardan datos

Normalmente: 1.

Servlet controlador invoca un método en bean lógico y éste devuelve un bean de datos

Modelo MVC III 

La Vista (View)  



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

Modelo MVC IV 

En resumen: 





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

Frameworks 



Las frameworks pueden ser vistas 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, el desarrollo de frameworks que den soporte a áreas comunes en todas las aplicaciones MVC es necesario 



Apache Struts es una de estas frameworks

Aplicaciones basadas en Struts consistirán de: 

Código Java

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)

¿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:  





   

Struts Action Struts ActionForm

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

Instalando Apache Struts I  

Instalar Apache Tomcat 4.x o superior Bajar la última versión de Apache Struts de: http:// struts.apache.org/download.cgi 

 

Actualmente en la versión 1.2 (fichero jakarta-struts-1.2.4.zip para Windows)

Crear directorio de aplicación. E.j: myStrutsApp Copiar ficheros .tld en directorio {StrutsDirectory}/contrib/struts-el/lib a myStrutsApp/WEB-INF:    

c.tld struts-bean-el.tld struts-html-el.tld struts-logic-el.tld

Instalando Apache Struts II 

Copiar los ficheros .jar files de {StrutsDirectory}/contrib/struts-el/lib a myStrutsApp/WEB-INF/lib directory:        



commons-beanutils.jar commons-collections.jar commmons-digester.jar commons-logging.jar jstl.jar standard.jar struts-el.jar struts.jar

Lo mejor es tomar la aplicación struts-blank.war como punto de partida.

Documentación y ejemplos de Struts 

En el directorio webapps de la distribución de Struts 1.2 se pueden encontrar varios ficheros .war muy útiles: 

struts-documentation.war  



En el subdirectorio api/index.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

Ejemplos de uso de Struts:   

struts-examples.war struts-blank.war  base para la creación de cualquier aplicación que use Struts etc.

Flujo de Control en Struts I

Flujo de Control en Struts II

Flujo de control en Struts III 

La clase org.apache.struts.action.ActionServlet es el eje de Struts. Dada una petición de entrada HTTP:   





El fichero de configuración web.xml contiene los url mappings para enviar las peticiones de llegada al ActionServlet, mientras que el fichero de configuración 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. 





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

El programador deberá definir un conjunto de getters y setter y sobreescribir los métodos validate() y reset()

Los objetos Action invocados deben ser desarrollados por el programador y extienden org.apache.struts.action.Action. Tienen un método execute() o (perform() en Struts 1.0) que ejecuta la lógica de negocio La acción devuelve un objeto ActionForward al servlet que especifica el siguiente paso a ejecutar, normalmente se transfiere el control a un

Pasos a seguir en el desarrollo de una aplicación en Struts          

Diseña la aplicación en términos de las acciones, vistas y estados del modelo Añade las librerías Java de Struts y los .tlds de sus etiquetas personalizadas a tu proyecto Configura tu web.xml para que envíe peticiones HTTP al ActionServet Configura el ActionServlet definiendo elementos y en struts-config.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 Desplegar la aplicación La aplicación ejemplo suministrada con Struts, strutsblank.war, es normalmente un buen punto de partida para desarrollar una nueva aplicación usando Struts

Actions en Struts  

Se crea una acción extendiendo la clase org.apache.struts.action.Action El ActionServlet ejecuta acciones invocando el método execute() tu clase Action 



Dentro del método execute() tienes acceso a:     



El método execute() contiene código para manipular el modelo 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

El método execute() devuelve un objeto ActionForward que indica al ActionServlet a dónde transferir el control a continuación

Form Beans 

Un ActionForm es un JavaBean con propiedades que corresponden a los controles de un formulario HTML. Los parámetros son mapeados a propiedades del bean.  











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

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 Después de escribir el código del form bean, es necesario asociarlo con una o más acciones a través del fichero de configuración de Struts struts-config.xml Cada vez que se llama a la acción , 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

¿Por qué se necesitan Forms Beans? 



¿Por qué no simplemente se accede a los parámetros de una petición, en vez de usar un form bean como intermediario? Razones: 

Los Form beans pueden ser validados antes de que una acción sea invocada 



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, junto con un mensaje de error 



Si la propiedad validate de un elemento Action en el fichero struts-config.xml contiene el valor true (por defecto), el método validate será invocado

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

Los form beans pueden ser usados por múltiples acciones o incluso una aplicación completa 

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.xml Una o varias propiedades dinámicas pueden ser pasadas a una instancia de org.apache.struts.action.DynaActionForm



Recursos de String/Manejo de Errores 

Recursos de String 





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.properties) Struts proporciona etiquetas personalizadas JSP tags para acceder a estos recursos

Manejo de errores 

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 errors.add("passphrase",new ActionError("error.passphrase.required"));

 

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:

Internationalization i18n    

Struts soporta internacionalización a través de ficheros de recursos, sus librerías 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. 

Ejemplo:   

 

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

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, por ejemplo, debajo del directorio WEB-INF/classes

Ejemplo web.xml de aplicación usando Struts <web-app> <servlet> <servlet-name>action <servlet-class>org.apache.struts.action.ActionServlet <param-name>application <param-value> com.develop.ejsp.struts.resources.ApplicationResources 1 <servlet-mapping> <servlet-name>action *.do

Configurando Struts 

Como en toda framework se minimiza el código Java a escribir y se maximiza la configuración a través de ficheros XML  



Struts se configura a través struts-config.xml Leído por la framework cuando arranca

Contiene:  

Fuentes de datos (data-sources) Form beans, variaciones de JavaBeans.    

 

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

Global forwards y ActionMappings 

Ejemplo struts-config.xml I <struts-config> <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"/>

Ejemplo struts-config.xml II

Procesamiento de una petición en Struts I 

Si el cliente envía la petición: 







http://server/app/GotoReplyToAction.do

El ActionServlet de Struts quita la extensión (.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.develop.ejsp.struts.actions.GotoMes sageAction El método execute() será invocado en el objeto GotoMessageAction: 

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

Procesamiento de petición en Struts III 





De los cuatro parámetros recibidos en execute(), ActionMapping y ActionForm son específicos a Struts El objeto ActionMapping contiene información de configuración proveniente de struts-config.xml file. 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:  



Uno con el nombre "succeeded" y otro "failed“

Si el método execute() se completa sin errores el método ActionMapping.findForward() es llamado, pasando el nombre del siguiente recurso a llamar.  

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)

Manejo de errores en Struts I Struts define la clase ActionErrors que mantiene una colección 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 código añade un sólo objeto ActionError a la colección, 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".  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 página o acción consecutiva.  La página JSP “failed” anterior debería 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;

Manejo de Formularios I 



La otra acción definida en el fichero de configuración de Struts era: Esta acción está asociada con el formulario llamado SigningForm, también definido en el fichero de configuración:

Manejo de Formularios II 





Si una acción 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 métodos en ActionForm pueden ser sobreescritos:  

validate() y reset()

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 parámetros de la petición de entrada llamando a los métodos setXXX() correspondientes.  Una vez poblado, el form bean es validado: 



Si el objeto ActionErrors devuelto es null o vacío significa que la validación tuvo éxito y una instancia del form bean creado, en este caso SigningForm, es pasado al objeto SigningAction Si la validación falla, la petición será re-direccionada por Struts a la página que contenía 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; } ...

Manejo de Formularios V // accessors and mutator omitted for clarity 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 execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

}

}

try { String username = ((SigninForm) form). getUserName(); String password = ((SigninForm) form). getPassword(); // etc. }

DataSources en Struts try { DataSource ds = servlet.findDataSource(“usuarios”); message = new Message(); message.getMessage(ds, request.getParameter( Message.MESSAGE_ID)), request.getParameter( GROUP_ID_NAME)) }  El código arriba muestra otra característica de Struts, la habilidad de configurar y usar referencias a javax.jdbc.DataSources  El extracto de struts-config.xml anteriormente mostrado tiene una sección para configurar las data sources de la aplicación.  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.onjava.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:      



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

Las funcionalidad de las etiquetas definidas en las librerías Bean y Logic es también provista por las librerías core y fmt de JSTL 

HTML Tags 

Estas etiquetas son principalmente usadas para:  



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

Algunas de las acciones más útiles son:       

base  genera un elemento HTML 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.

Logic Tags 

Usadas para:   



Iterar sobre colecciones Generación condicional de salida, y Flujo de aplicación

Algunas de las acciones más útiles son: 

   

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

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: 



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 



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

Tiles define Layout Managers para JSPs

Su objetivo principal es evitar en los JSPs contenido de marcado que corresponda con el layout del portal  factoriza este marcado, de tal manera que la modificación del layout sea sencilla y eficiente

JSP Templates 

Un template es una página JSP que usa una librería de etiquetas personalizadas para describir la disposición (layout) de los componentes de la página 



Define cómo aparecerán las páginas JSP de una aplicación, sin especificar el contenido Esta definición es utilizada por todos los JSPs sin necesidad de mezclar layout con contenido

Ejemplo Tiles: index.jsp I <%@ <%@ <%@

taglib taglib taglib

uri="/WEB-INF/struts-html.tld" prefix="html" %> uri="/WEB-INF/struts-logic.tld" prefix="logic" %> uri="/WEB-INF/struts-bean.tld" prefix="bean" %>

<bean:message key="global.title"/> <script language=javascript src="include/scripts.js"> <%@ include file="include/head.inc"%> <%@ include file="include/menubar.inc"%>

Ejemplo Tiles: index.jsp II <%@ include file="include/mainoffer.inc"%>

<%@ include file="include/featureditems.inc"%> <%@ include file="include/copyright.inc"%>


Ejemplo Tiles: storefront DefaultLayout.jsp <%@ taglib uri=“/WEB-INF/struts-html.tld” prefix=“html” %> <%@ taglib uri=“/WEB-INF/struts-bean.tld” prefix=“bean” %> <%@ taglib uri=“/WEB-INF/tiles.tld” prefix=“tiles” %> <bean:message key=“global.title”/>

Ejemplo Tiles: storefrontdefs.jsp <%@ taglib uri=“/WEB-INF/tiles.tld” prefix=“tiles” %>

Ejemplo Tiles: index.jsp <%@ taglib uri=“/WEB-INF/tiles.tld” prefix=“tiles” %> <%@ include file=“../common/storefront-defs.jsp” %>

Para más información sobre Tiles Framework ir a: http://www.lifl.fr/~dumoulin/tiles/index.html



Para instalar Tiles en Struts es necesario añadir una sección plug-in en struts-config.xml para la clase: org.apache.struts.tiles.TilesPlugin

Mi primera aplicación con Apache Struts 

Aplicación para llevar a cabo login 



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 usario y ofrece enlaces a la aplicación Página Logon que permite al usuario introducir username y password 

Esta página lleva a cabo la validación que los datos introducidos son correctos

Welcome.html <TITLE>Welcome World!!

Welcome World!

Powered by Struts

Welcome.jsp I <%@ taglib uri="/tags/struts-bean" prefix="bean" %> <%@ taglib uri="/tags/struts-html" prefix="html" %> <%@ taglib uri="/tags/struts-logic" prefix="logic" %> <TITLE>Welcome World!!

Welcome !

Welcome World!

  • Sign in
  • Sign out
Powered by Struts

Welcome.jsp II garantiza que referencias a imágenes o otros recursos son relativas a la localización del JSP

Welcome !

 Esta etiqueta personalizada asegura que el usuario solamente es saludado si ha efectuado login  tiene el comportamiento opuesto
  • Sign in
  •  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. 

    Logon.html <TITLE>Sign in, Please!
    Username:
    Password:
    <script language="JavaScript" type="text/javascript">

    Logon.jsp I <%@ taglib uri="/tags/struts-html" prefix="html" %> <TITLE>Sign in, Please!
    Username:
    Password:


    Logon.jsp II <%@ taglib uri="/tags/struts-html" prefix="html"%>  La librería de etiquetas html definida por Struts es disponible a la página  garantiza si ha habido algún error durante el login, que estos errores sean visualizados  Produce un formulario HTML para la entrada de datos. También genera JavaScript para mover el cursor al campo username del formulario 

    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.jsp III  Crea un control de entrada HTML para un campo de texto. Asignará a este campo la propiedad username del JavaBean de ayuda antes mencionado.  crea un campo de entrada  y generan botones HTML Submit y Reset. Dos objetos serán invocados cuando se usen estos botones:  

    ActionForm Action

    Configuración de la acción logon I 

    Configuración para la pantalla de logon: 



    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 

    Configuración de la acción logon II  La configuración asociada al atributo acción en Struts sería:  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  Este extracto del fichero de configuración relaciona el nombre lógico 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 

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

    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,password)); } // end isUserLogon

    LogonAction: un ejemplo de un LogonAction II public ActionForward execute(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

    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 validación de la entrada del usuario y una excepción es lanzada, entonces el error es transformado en un ActionError y el control es devuelto a la página 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 envía control al forward success declarado en el fichero de configuración como:

    Modificaciones a realizar en guessing 1.

    2. 3.

    4.

    5. 6.

    Modificar action /guess en struts-config.xml, haciendo que esa acción esté asociada a la clase es.deusto.guessing.action.GuessingAction y al formulario es.deusto.guessing.form.GuessingForm. Asegurarse que existe correspondencia entre clase guessing.jsp y GuessingForm Asegurarse que un usuario después de haber hecho login pueda jugar una partida, el usuario podrá realizar intentos infinitamente, pero esos intentos hay que contabilizarlos y visualizarlos cada vez que el usuario falla o adivina el número El número a adivinar es asociado a la sesión del usuario y generado la primera vez que la acción execute se ejecuta para un usuario Idealmente crear una clase llamada Game que contenga el número a adivinar y el número de intentos fallidos Modificar la aplicación de manera que nuevos usuarios puedan ser definidos y los datos de login de esos usuarios se salven en un fichero .properties.

    Más Ejemplos 

    Para más ejemplos del uso de Struts visitar: 

    http://struts.sourceforge.net/











    • • • • • •



    Especificaciones de las tecnologías J2EE Java™ 2 Platform, Enterprise Edition Specification, Version 1.4

    (J2EE specification). Java™ API for XML-Based RPC Specification, Version 1.1 ( JAXP specification). Java™ API for XML Processing Specification, Version 1.2 ( JAXP specification). SOAP with Attachments API for Java Specification, Version 1.2 (SAAJ specification). Java API for XML Registries Specification, Version 1.0 (JAXR specification). Web Services for J2EE Specification, Version 1.1. Java API for XML Binding Specification (JAXB specification). Java™ Servlet Specification, Version 2.4 (Servlet specification). JavaServer Pages™ Specification, Version 2.0 (JSP specification). Enterprise JavaBeans™ Specification, Version 2.1 (EJB specification). J2EE™ Connector Architecture Specification, Version 1.5 ( Connector specification). Java™ Message Service Specification, Version 1.0.2 (JMS specification).

    Herramientas J2EE     

    SUN Microsystems Developer Network

    XML Sun Developer Network Java API for XML Processing (JAXP) Java API for XML Registries (JAXR) Java API for XML-based RPC (JAX-RPC) Java Architecture for XML Binding (JAXB) 





    Introducción a JAXB con NetBeans

    SOAP with Attachments API for Java (SAAJ) The J2EE 1.4 Tutorial for NetBeans

    Related Documents

    Arquitectura J2ee Struts
    November 2019 9
    Arquitectura J2ee
    December 2019 25
    J2ee
    November 2019 24
    J2ee
    December 2019 25
    J2ee
    November 2019 24