Structs2

356
Struts 2 El framework de desarrollo de aplicaciones Java EE Este libro sobre Struts 2 se dirige a los desarrolladores Java que quieren tener un libro de referencia para la utilización del framework de Java EEmás popular. El libro está dividido en 23 capítulos que explican elfuncionamiento y la ejecución de proyectos Web a partir del framework. Los primeros capítulos describen el framework de Java EE de referencia con sus servicios y su instalación a través del modelo de diseño MVC. Los capítulos 3 y 4 presentan un ejemplo concreto de proyecto de Struts 2para gestionar los registros y la depuración. En el siguiente capítulo, el lector podrá conocer en detalle la administración de las acciones, elmapping, los formularios y las redirecciones. El capítulo 6 presenta de manera extensa la biblioteca de etiquetas de Struts. En el resto del libro, el lector aprenderá a administrar los mensajes y la internacionalización, así como la validación de las entradas, los tipos y las conversiones. Un capítulo está dedicado al modelo de acceso a los datos, a la carga y descarga de datos y a la carga de las páginas. El desarrollo de los interceptores se detalla ampliamente en el capítulo 14, así como la gestión de los resultados en el capítulo 15. Los siguientes capítulos están dedicados a Ajax Struts y a los motores de plantillas, así como a la visualización de la información a través de XSLT. Los últimos capítulos se refieren a la utilización y el desarrollo de complementos con Struts, así como a la configuración cero y el lenguaje OGNL. Cada concepto se expone de forma teórica y técnica para permitir a los diseñadores que tengan conocimientos en Java EE utilizar una API que facilita el desarrollo de aplicaciones Web. Las aplicaciones utilizadas en los capítulos proceden de ejemplos concretosy se pueden descargar en esta página. Jérôme LAFOSSE Ingeniero en informática y graduado en la CNAM, Jérôme Lafosse trabaja como asesor, diseñador y formador en las tecnologías Java. Especialista en tecnologías Web, trabaja para fomentar las herramientas y soluciones de código abierto (Open Source) para el desarrollo de proyectos de Internet. También enseña la plataforma Java Enterprise Edition y el diseño de proyectos Web en Licenciaturas y Masters.

description

Programación

Transcript of Structs2

  • Struts 2El framework de desarrollo de aplicaciones Java EE

    Este libro sobre Struts 2 se dirige a los desarrolladores Java que quieren tener un libro dereferencia para la utilizacin del framework de Java EEms popular. El libro est dividido en 23captulos que explican elfuncionamiento y la ejecucin de proyectos Web a partirdel framework. Los primeros captulos describen el framework de Java EE de referencia con sus servicios ysu instalacin a travs del modelo de diseo MVC. Los captulos 3 y 4 presentan un ejemploconcreto de proyecto de Struts 2para gestionar los registros y la depuracin. En el siguientecaptulo, el lector podr conocer en detalle la administracin de las acciones, elmapping,los formularios y las redirecciones. El captulo 6 presenta de manera extensa la biblioteca deetiquetas de Struts. En el resto del libro, el lector aprender a administrar los mensajes y lainternacionalizacin, ascomo la validacin de las entradas, los tipos y lasconversiones. Un captulo est dedicado almodelo de acceso a los datos, a la carga y descarga de datos y a la carga de las pginas. El desarrollo de los interceptores se detalla ampliamente en el captulo 14, as como la gestin delos resultados en el captulo 15. Los siguientes captulos estn dedicados a Ajax Struts y a los motores de plantillas, as como ala visualizacin de la informacin a travs de XSLT. Los ltimos captulos se refieren a lautilizacin y el desarrollo decomplementos con Struts, as como a la configuracin cero y ellenguajeOGNL. Cada concepto se expone de forma terica y tcnica para permitir a los diseadores que tenganconocimientos en Java EE utilizar una API que facilita el desarrollo de aplicaciones Web. Las aplicaciones utilizadas en los captulos proceden de ejemplos concretosy sepueden descargar en esta pgina.

    Jrme LAFOSSE

    Ingeniero en informtica y graduado en la CNAM, Jrme Lafosse trabaja como asesor,diseador y formador en las tecnologas Java. Especialista en tecnologas Web, trabaja parafomentar las herramientas y soluciones de cdigo abierto (Open Source) para el desarrollo deproyectos de Internet. Tambin ensea la plataforma Java Enterprise Edition y el diseo deproyectos Web en Licenciaturas y Masters.

  • Qu es un framework?

    En programacin existen dos tipos de individuos:

    Los programadores de sistemas.

    Los programadores de aplicaciones.

    Los programadores de sistemas escriben el cdigo que utilizarn los programadores de aplicaciones.

    Los programadores de sistemas desarrollan los lenguajes Java, PHP, C o C++ y los programadores de

    aplicaciones utilizan estos lenguajes y herramientas para crear valor aadido con fines comerciales.

    Los programadores de aplicaciones se concentran en sus proyectos sin preocuparse de las tcnicas y

    las mecnicas de bajo nivel. Los programadores de aplicaciones utilizan una serie de bibliotecas o

    herramientas que reciben el nombre de framework.

    Un framework es un conjunto de bibliotecas, herramientas y normas a seguir que ayudan a

    desarrollar aplicaciones. Los frameworks los desarrollan los programadores de sistemas. Un

    framework est compuesto por varios segmentos/componentes que interactan los unos con los

    otros. Las aplicaciones pueden escribirse de manera ms eficaz si utilizamos un framework adaptado

    al proyecto en lugar de tener que volver a inventar la rueda cada vez. Un framework Java proporciona

    un conjunto de caractersticas a partir de una implementacin de objeto. En proyectos de desarrollo a

    gran escala y de diseo en equipo, los frameworks son muy tiles, incluso imprescindibles.

    En la actualidad, existen diferentes tipos de framework:

    los frameworks de infraestructura de sistema, que permiten desarrollar sistemas de

    explotacin, herramientas grficas y plataformas Web (Struts, Spring...);

    los frameworks comunicativos (llamados software);

    los frameworks de empresa (desarrollos especficos);

    los frameworks de gestin de contenido (tipo Content Management System).

    Los frameworks permiten la reutilizacin de cdigo, la estandardizacin del desarrollo y la utilizacin

    del ciclo de desarrollo de tipo interactivo-incremental (especificacin, codificacin, mantenimiento y

    evolucin). En ocasiones hablamos de paquetes de programas evolucionados cuando diseamos un

    framework y su ciclo de vida. En la actualidad, existen muchos frameworks en todos los dominios de

    aplicacin y en prcticamente cualquier idioma. Esta es una lista no exhaustiva de los frameworks

    utilizados en Java:

    Apache Struts

    WebWork

    JSF (Java Server Faces)

    Spring

    Wicket

  • Por qu utilizar un framework?

    Los Servlets se definieron en 1998 y dos aos despus, algunas grandes empresas ya haban

    apostado por Java para sus aplicaciones Web. Durante varios aos, estas empresas desarrollaron

    sus propios proyectos de manera independiente y sin seguir ningn estndar. Hoy en da, todas

    estas sociedades tienen en cuenta la importancia de los frameworks. La eleccin del framework de

    desarrollo forma parte de la estrategia de una empresa ya que ser determinante para la calidad, la

    productividad y la durabilidad de los proyectos.

    1. Normas y estndares

    El desarrollo de las TI con la utilizacin de normas permite generalizar las buenas prcticas y

    armonizar los desarrollos dentro de la empresa, facilitando el mantenimiento. La plataforma de

    desarrollo Java EE permite utilizar normas, adems de complejas herramientas que vienen tambin

    acompaadas de otras normas.

    2. Framework y desarrollo Web

    La definicin inicial del API Servlet se queda corta a la hora de abarcar un desarrollo complejo de

    aplicaciones totalmente basadas en Servlets. Al principio, las aplicaciones Java se basaban en el

    principio del API Common Gateway Interface (CGI) y progresivamente fueron apareciendo los

    frameworks de Java para cubrir las carencias o debilidades del API Servlet y JavaServer Pages (JSP).

    La eleccin del API tendr un impacto significativo en el rendimiento, el funcionamiento, la calidad y

    el mantenimiento de la aplicacin. Del mismo modo, puesto que el framework constituir los

    cimientos sobre los que se construir el software, su durabilidad ser tambin fundamental.

  • Los distintos tipos de framework

    Existen varios tipos de herramientas para el desarrollo de aplicaciones. Un framework de tipo

    "interno", es decir, desarrollado por la empresa, no es la mejor solucin. Desde los primeros aos de

    Java, los equipos de informticos inventaron sus propias herramientas para el desarrollo y las

    grandes empresas, en ocasiones, creaban su propio framework. Hay que evitar este tipo de

    desarrollos, ya que ninguna empresa podr dedicar suficientes esfuerzos para el mantenimiento y la

    evolucin del framework. Adems, los frameworks de cdigo abierto (Open Source) se convierten en

    estndares, se prueban y validan a escala mundial a travs de los proyectos realizados.

    Los frameworks de editor presentan un riesgo para las empresas desde un punto de vista de

    desarrollo. De hecho, siempre tienen un objetivo oculto, que es la fidelizacin de la empresa a las

    herramientas del editor.

    Los frameworks de cdigo abierto (Open Source) son en la actualidad los ms numerosos y los que

    ms xito tienen. Aqu, nos volvemos a encontrar con la calidad del trabajo y la misma dinmica que el

    proyecto Apache. Una buena parte de estos proyectos de framework nace del consorcio Apache. Los

    frameworks son herramientas complejas independientemente de la calidad del desarrollo y del origen

    de los proyectos. No es necesario dominar todos los frameworks existentes, pero s es necesario

    saber utilizarlos correctamente. Una vez se ha elegido el framework, es necesario formarse y

    constituir una unidad de asistencia para los equipos de desarrollo.

  • Qu framework elegimos?

    Poco a poco, las API y herramientas de todo tipo han ido sumergiendo el desarrollo de Internet

    basado en la tecnologa Java. La eleccin de un framework debe basarse en los siguientes criterios:

    Debemos disear todo de principio a fin?

    El desarrollo permite el uso de una aplicacin previamente desarrollada o de una parte?

    Podemos usar un entorno como base para la aplicacin?

    El diseo de principio a fin permite dominar perfectamente una tecnologa, pero requiere de mucho

    tiempo y dinero. El desarrollo a partir de aplicaciones existentes es interesante nicamente si los

    desarrolladores de los proyectos anteriores estn presentes. El tercer enfoque (usar un entorno

    como base para la aplicacin) es sin duda la mejor opcin en la mayora de los casos.

  • Introduccin a la programacin en Java Entreprise Edition

    Las tecnologas Servlets y JavaServer Pages (JSP) son los cimientos del desarrollo en Java EE. El

    problema con estas tecnologas es la cantidad de cdigo que es necesario desarrollar para las

    comunicaciones HTML/JSP, Servlets y Modelos. De igual modo, sin usar un modelo de diseo de tipo

    Modelo Vista Controlador (MVC), mezclar scripts HTML, SQL y Java es una mala idea ya que la

    depuracin es entonces ms compleja y lleva ms tiempo. La mezcla de cdigo evita la reutilizacin y

    la visibilidad de las estructuras de control, haciendo confusa la presentacin y el acceso a los datos.

    Por ltimo, el uso de objetos JavaBeans y de administradores de etiquetas como JSTL (Java Standard

    Tag Library) permite un desarrollo simple y consistente, incluso para proyectos complejos. La escritura

    de cdigo HTML/XHTML en pginas JSP es muy rpida para el desarrollador. De hecho, los JSP no

    reemplazan a los Servlets sino que son ms bien complementarios.

    Con un modelo de sitio muy simple realizado completamente en JSP, las pginas se compilan y se

    transforman en Servlets. Este es el modelo ms utilizado por los programadores principiantes debido

    a su simplicidad y rapidez de aplicacin.

    Con un modelo de diseo un poco ms complejo, los desarrolladores usan los Servlets para los

    procesamientos y las pginas JSP para la presentacin. Este modelo es ms difcil de aplicar, pero

    tambin es el ms natural y el que ofrece un mejor mantenimiento.

    Por ltimo, para una arquitectura multinivel de tipo MVC, los Servlets representan el aspecto de

    Control, los Modelos el acceso a los datos y los JPS la parte Vista. Este modelo es ms complejo de

    desarrollar, pero mucho ms simple de probar, mantener y hacer evolucionar. Del mismo modo, cabe

    destacar el concepto de reutilizacin con este tipo de modelo.

  • Struts 1

    El proyecto Open Source Jakarta-Struts desarrollado por el consorcio Apache permite agilizar el

    desarrollo de aplicaciones de Internet. Struts 1 casi se ha convertido en el estndar de facto para los

    proyectos Java EE. Struts 1 es un entorno agradable y potente que gestiona la aplicacin as como las

    tareas ms frecuentes (enrutamiento, acciones, validaciones...). Otra ventaja de su uso es el nmero

    creciente de usuarios que tienden a perpetuar el proyecto. En la actualidad, muchos entornos de

    desarrollo como Eclipse ofrecen herramientas para la programacin de Struts 1.

    Struts 1 es un framework que ofrece herramientas de validacin de las entradas de los usuarios

    (introducidas mediante un formulario), bibliotecas de etiquetas JSP para la creacin rpida de pginas,

    una tcnica de enrutamiento para las pginas y acceso Web, as como un proceso de creacin de

    formularios basados en archivos XML. Struts 1 tambin ofrece otras ventajas:

    Struts 1 funciona con todos los servidores Java EE (Tomcat, WebSphere, Weblogic...).

    Struts 1 ofrece una arquitectura slida y estable (proyecto Apache).

    Struts 1 se adapta a las aplicaciones Web de gran tamao.

    Struts 1 permite descomponer una aplicacin compleja en componentes ms simples.

    Struts 1 garantiza un desarrollo similar para los equipos de programadores.

    Struts 1 posee una documentacin abundante.

    Struts 1 permite un desarrollo rpido y poco costoso.

    El trmino Struts hace referencia a pilares o columnas, en el sentido arquitectnico del trmino, con el

    concepto de ladrillos que sostienen los edificios, las casas y los puentes para evitar que se conviertan

    en ruinas.

  • Struts 2

    Como acabamos de mencionar en la introduccin, en la actualidad se utiliza el modelo de diseo de

    tipo MVC para el desarrollo de aplicaciones Web evolucionadas. Sin embargo, los principales

    inconvenientes de este tipo de diseo son:

    la dificultad de comprender el modelo y el nivel de conocimientos que requiere;

    el nmero de archivos que es necesario producir (cerca de tres veces ms);

    el aspecto reiterativo de las tareas que se realizan.

    La pregunta entonces es: cmo reducir estos inconvenientes y aumentar la productividad?

    Poco antes del ao 2000, Craig R. McClanahans decidi crear una herramienta de diseo de tipo

    framework para agilizar los desarrollos Java EE. Despus, en mayo de 2000, don a la fundacin

    Apache su framework llamado Struts 1.0 cuyo primer lanzamiento se program para junio de 2001,

    que despus se convertira en el framework de diseo Java EE ms popular del mundo.

    Casi al mismo tiempo, varios desarrolladores trabajaban en la creacin de otro framework de

    desarrollo llamado WebWork. Este framework nunca llegara a tener la popularidad de Struts, a pesar

    de ser superior en varios puntos, incluyendo la aplicacin de validaciones de formularios y la

    arquitectura global para la gestin de JavaBeans (sin necesidad de utilizar Beans de formularios). Un

    punto importante de WebWork en relacin con Struts 1.X es el concepto de las pruebas. Con Struts

    1.X se requiere un navegador Web para realizar una parte de las pruebas, mientras que WebWork

    puede funcionar sin utilizar un navegador.

    A finales de 2005, el producto WebWork y el framework ms popular Struts 1.0 se fusionaron para

    fundar Struts TI (Titanium) que poco despus pas a ser Struts 2.0. Los diseadores de Struts 1.0 y

    Jason Carreiras, responsable de WebWork, proponen entonces un framework que reagrupa las

    ventajas de las dos herramientas anteriores (WebWork y Struts 1.0). Sin embargo, Struts 2 no es una

    extensin de Struts 1 y, desafortunadamente, eso puede decepcionar a muchos desarrolladores y

    arquitectos Web, ya que este nuevo framework tiene un diseo completamente nuevo. Por lo tanto,

    los especialistas debern volver a aprender completamente los comandos y las funcionalidades de

    Struts 2.0. El nuevo diseo correspondera en mayor medida a WebWork 2.2 (WebWork basado en

    XWork de Open Symphony) que a una evolucin de Struts 1.0.

    El framework Struts 2 se basa en una declaracin de la arquitectura en forma de archivos XML o con

    anotaciones Java localizadas en los archivos de clases de acciones. Struts 2 es un framework

    orientado a acciones. Las acciones se descomponen en tres funciones. Primero, las acciones tienen la

    funcin ms importante del framework, encapsular el procesamiento y el trabajo que deber realizar

    el servicio. Segundo, las acciones permiten manipular automticamente los datos de las consultas

    durante las transferencias. Tercero, el framework determina qu resultado debe ser devuelto y la

    vista presentada en respuesta a un procesamiento. Las acciones de Struts 2 implementan objetos

    JavaBeans (clases Java simples) para cada grupo de datos enviado en la consulta. Cada parmetro

    de la consulta se declara en la clase de accin con un nombre idntico para realizar automticamente

    la asignacin de valores. La finalidad de una accin es devolver una cadena de caracteres,

    permitiendo seleccionar el resultado que se va a mostrar.

    En resumen, Struts 2 se basa en el modelo de diseo de tipo MVC II tal y como se explica en el

    siguiente esquema. Permite un desarrollo ms rpido, ms flexible y resuelve varios problemas de

    diseo ofreciendo los siguientes servicios:

    un sistema evolucionado de gestin del enrutamiento o la navegacin;

    un sistema de validacin de formularios y de entradas, fcil de aplicar;

    un potente sistema de complementos o de extensiones (para los grficos, fuentes de

    datos...);

    gestin de la internacionalizacin para el desarrollo de sitios multilinges;

    compatibilidad con la tecnologa Ajax;

  • una herramienta de depuracin incluida;

    una potente biblioteca de etiquetas.

    Arquitectura MVC II

    Struts 2 ofrece (al igual que Struts 1) la posibilidad de utilizar un mnimo de reglas del diseo que no

    son obligatorias:

    No utilizar cdigo 100% Java en las pginas JSP. Toda la lgica de control reside en las clases

    de acciones (Servlets).

    Utilizar bibliotecas de etiquetas para acceder a los objetos y navegar por las colecciones.

    Escribir un mnimo cdigo repetitivo y utilizar las herramientas que ofrece el framework.

    Este framework tambin tiene como objetivo ayudar a los desarrolladores de aplicaciones Web en

    Java a crear proyectos de calidad siguiendo una norma o estndar. Este framework tambin ayuda a

    los desarrolladores a organizar la lgica de la aplicacin.

    La eleccin del framework Struts 2 se basa en los siguientes puntos:

    Fiabilidad: el proyecto se desarroll en mayo de 2000 y desde entonces ha tenido un

    seguimiento. Este proyecto tiene una reputacin excelente y mejora constantemente sus

    defectos.

    Flexibilidad: cada accin puede ser personalizada, los archivos de configuracin son muy

    flexibles en trminos de utilizacin y las validaciones son fciles de aplicar.

    Rendimiento: la arquitectura diseada por Struts 2 est basada en WebWork. Tiene un

    rendimiento especialmente alto y su mantenimiento es sencillo gracias a la separacin por

    capas.

    Las principales caractersticas del framework Struts 2 son las siguientes:

    los tipos de conversiones automticas para las colecciones procedentes de consultas HTTP;

    los archivos de configuracin modulables que se usan por paquetes;

    las anotaciones Java 5 que reducen las lneas de cdigo para la configuracin;

    el uso de etiquetas permite aplicar temas o plantillas (templates);

    el uso del lenguaje de expresin OGNL;

    el uso opcional del complemento interceptor, que permite ejecutar consultas complejas y

    largas como tareas en segundo plano con el envo mltiple (actualizacin de pginas);

    la integracin simple de herramientas como JSTL, Spring o Hibernate.

    El framework Struts 2 es una segunda generacin de framework MVC. La principal ventaja del

    concepto de los interceptores es la flexibilidad del conjunto y la configuracin propuesta. Struts 2

    responde tambin al principio de empaquetamiento de la acciones. Cuando declaramos clases de

  • accin con un archivo XML o anotaciones Java, el framework organiza todos estos componentes en

    forma de un software de paquete (packages). Los paquetes de Struts 2 son similares a los de Java.

    Este mecanismo permite igualmente agrupar las acciones por dominio. Las URL de la aplicacin se

    asociarn a los paquetes donde estn declaradas las acciones.

  • Instalacin del framework Struts 2

    El framework Struts 2 est basado en Java EE 5 (Servlets 2.4 y JSP 2.0 como mnimo). Para utilizar los

    ejemplos del libro, usamos las ltimas versiones de las herramientas con el JDK 1.6, Tomcat 6.X, los

    Servlets 2.5, Struts 2.1.6 y Eclipse/Lomboz 3.4. Puede visitar el sitio oficial de Struts 2 a travs de la

    siguiente direccin: http://struts.apache.org/2.x/

    La instalacin del API es sencilla, basta con copiar los archivos descargados en las carpetas de una

    aplicacin Web Java EE tradicional. Podemos crear un nuevo proyecto y copiar los archivos necesarios

    (bibliotecas .jar) o bien instalar el framework utilizando una aplicacin Struts virgen proporcionada con

    el framework (http://apache.cict.fr/struts/examples/struts-2.1.6-apps.zip).

    Existen varias versiones de proyectos para instalar Struts 2. En la seccin Download del sitio, podemos

    encontrar las ltimas versiones de Struts con archivos en formato .zip. Las versiones struts-version-

    all.zip incluyen todas las bibliotecas, archivos fuente y ejemplos de aplicacin. La versin utilizada en

    este manual es struts-2.1.6-all.zip de 90 MB. La versin struts-version-lib.zip contiene nicamente las

    bibliotecas en formato .jar necesarias para el funcionamiento de Struts 2.

    El framework Struts V2 est compuesto de varios archivos. Las bibliotecas Java (.jar) contienen todas

    las clases utilizadas por el framework:

    commons-fileupload.jar (biblioteca de gestin de la carga en Java).

    commons-logging.jar (biblioteca de logging/registros).

    commons-io-version.jar (biblioteca de gestin de las entradas/salidas).

    freemarker-version.jar (biblioteca utilizada para la presentacin y el motor de plantillas).

    ognl-version.jar (biblioteca utilizada para la manipulacin de objetos Java).

    junit-version.jar (biblioteca del framework de gestin de las pruebas unitarias).

    struts2-core-version.jar (biblioteca completa de Struts 2, es la biblioteca principal).

    xwork-version.jar (biblioteca de XWork con las dependencias).

    La biblioteca nativa del framework es struts2-core-version.jar mientras que las bibliotecas commonslas

    proporciona la fundacin Apache y el proyecto Commons.

    Existen dos maneras de instalar el framework Struts:

    Copiar las bibliotecas .jar en el directorio /WEB-INF/lib de una nueva aplicacin.

    Utilizar una aplicacin de Struts vaca, incluida en el paquete, que permite instalar el

    framework. Esta aplicacin vaca lleva el nombre de struts2-blank-version.war para indicar que

    est en blanco.

    Para instalar esta aplicacin, es necesario:

    Copiar el archivo struts-blank-version.war en una carpeta (por ejemplo, instalacionstruts2).

    Descomprimir su contenido.

    Abrir Eclipse y hacer clic en Archivo - Nuevo - Proyecto - Java - Proyecto Tomcat o Proyecto

    Web.

    Dar un nombre a su proyecto (por ejemplo, instalacionstruts2) y seleccionar la carpeta

    anterior.

  • Proyecto Eclipse

    Editar el proyecto y cambiar el nombre de los paquetes sin el trmino java.

    El rbol del proyecto debe ser el siguiente:

    rbol de instalacionstruts2

    Iniciar Tomcat y abrir un navegador.

    Introducir la siguiente URL en el navegador: http://localhost:8080/instalacionstruts2/

    Tambin podemos probar la aplicacin de autenticacin que viene por defecto:

    http://localhost:8080/instalacionstruts2/example/Login.action

  • Formulario de instalacionstruts2

  • En resumen

    En este captulo se ha explicado el concepto de framework y las ventajas de la utilizacin de dicha

    herramienta para los desarrollos Web.

    En la segunda parte se han presentado los distintos framework y se ha aportado la informacin

    necesaria para reflexionar acerca de la eleccin de un framework. En el siguiente punto se recuerdan

    los servicios que ofrece el framework Struts 1 al mismo tiempo que se presenta la nueva herramienta

    Struts 2, se explica su instalacin y la puesta en marcha del primer ejemplo en blanco.

  • Presentacin

    Como ya se ha explicado, es recomendable utilizar el modelo de diseo Modelo Vista Controlador

    (MVC) para el desarrollo de aplicaciones Web en Java. Antes de comenzar el diseo, es importante

    comprender el funcionamiento de este modelo de desarrollo. La arquitectura MVC que ofrece Sun es la

    solucin de desarrollo Web del lado del servidor que permite separar la parte lgica de la

    presentacin en una aplicacin de Internet. Este es un punto esencial del desarrollo de proyectos ya

    que permite a todo el equipo trabajar por separado (cada usuario gestiona sus propios archivos, sus

    programas de desarrollo y sus componentes).

    Esta arquitectura tiene su origen en el lenguaje SmallTalk a principios de la dcada de 1980, por lo

    tanto no es un nuevo modelo (design pattern) nicamente vinculado a Java EE. El objetivo principal es

    el de dividir la aplicacin en tres partes distintas: el modelo, la vista y el controlador.

    En la arquitectura MVC nos encontramos con:

    El modelo representado por los EJB y/o JavaBeans y/o sistemas de persistencia (Hibernate, objetos

    serializados en XML, almacenamiento de datos por medio de JDBC...).

    La vista representada por los JSP o clases SWING.

    El controlador representado por los Servlets o clases Java.

    Arquitectura MVC I

    Principio de funcionamiento de la arquitectura MVC

    El cliente enva una consulta HTTP al servidor. En general, esta consulta es un Servlet (o un

    programa ejecutable del lado del servidor) que procesa la solicitud.

    El Servlet recupera la informacin transmitida por el cliente y delega el procesamiento a un

    componente adaptado.

    Los componentes del modelo manipulan o no los datos del sistema de informacin (lectura,

    escritura, actualizacin, eliminacin).

    Una vez finalizados los procesamientos, los componentes le devuelven el resultado al Servlet.

    El Servlet entonces almacena el resultado en el contexto adaptado (sesin, consulta,

    respuesta...).

    El Servlet llama a la pgina JSP adecuada que puede acceder al resultado.

    El JSP se ejecuta, utiliza los datos transmitidos por el Servlet y genera la respuesta al cliente.

    En proyectos simples, las consultas HTTP las administran los componentes Web que reciben las

    consultas, crean las respuestas y las devuelven a los clientes. En este caso tenemos un nico

    componente responsable de la lgica de visualizacin, de la lgica empresarial y de la lgica de

    persistencia. En la arquitectura anterior, la visualizacin y la manipulacin de los datos se mezclan en

    un nico componente de Servlet. Esto puede ser en gran medida adecuado para un servicio especfico

    no evolutivo y simple, pero puede convertirse en un problema cuando el sistema se desarrolla. En

    esta arquitectura se introduce cdigo Java y cdigo HTML en los Servlets o JSP. Existen varias

    soluciones a este problema. La ms sencilla tiene que ver con la aparicin de las pginas JSP y

    consiste en crear archivos de encabezado, de pie de pgina, de procesamiento... e incluir todo en una

    pgina general.

  • La arquitectura MVC separa la lgica empresarial de la visualizacin. En este modelo, un componente

    se encarga de recibir las consultas (Servlets), otro procesa los datos (Clases) y un tercero administra

    la visualizacin (JSP). Si la interfaz entre estos tres componentes est claramente definida, ser ms

    fcil modificar un componente sin afectar a los otros dos.

    En una aplicacin Web evolucionada, la lgica MVC es la siguiente:

    El cliente emite consultas al servidor. Cada accin precisa corresponde a un Servlet que redirige las

    consultas a una pgina JSP adecuada, realiza un procesamiento o accede a los datos y, en este caso,

    inicia otro programa que se encargar de responder a la solicitud del usuario actual.

    El siguiente esquema presenta una estructura de tipo MCV con la utilizacin de Servlets y pginas

    JSP.

    Arquitectura MVC, Servlets y JSP

    Los Servlets, que tienen una funcin de controlador en una aplicacin MVC, deben disponer de un

    medio para transmitir las consultas a los componentes encargados de la visualizacin. Este medio lo

    proporciona el objeto RequestDispatcher. Este componente permite trasladar una consulta de un

    componente a otro.

    Obtenemos un objeto RequestDispatcher con el mtodo getServletContext(). Desde este objeto, es

    posible obtener un RequestDispatcher con la ayuda de los mtodos

    siguientes:getNamedDispatcher(nombre) o getRequestDispatcher(ruta). El

    mtodo getRequestDispatcher(...)funciona con una ruta que comienza por la barra y que es relativo

    al contexto de la aplicacin. El mtodo getNamedDispatcher(...) corresponde a un sub-

    elemento de un elemento del descriptor de

    implementacin web.xml.

    Los componentes son muy numerosos, pero tambin muy simples. Sus especificaciones hacen que

    puedan desarrollarse por parte de especialistas: los Servlets y EJB por desarrolladores Java, los JSP

    por desarrolladores y Webdesigners, los accesos a los datos por especialistas de SQL... Esta divisin

    permite tambin un mantenimiento ms sencillo del sistema. As, podremos cambiar fcilmente la

    identidad grfica utilizando las vistas sin tocar el modelo y el controlador.

    En el modelo de diseo MVC, tenemos un Servlet o un filtro que representa el controlador del modelo.

    Struts 1 utiliza un Servlet, mientras que Struts 2 utiliza un filtro. Para el modelo utilizamos los POJO

    (Plain Old Java Object) que son simples objetos en oposicin a los EJB.

    El acrnimo POJO se utiliza para hacer referencia a la simplicidad de la utilizacin de un objetoJava en comparacin con la dificultad de la utilizacin de un componente EJB (Enterprise Java

    Bean). Los JavaBeans (no confundir con los EJB) son componentes lgicos simples reutilizables ymanipulables. Para que sea una clase JavaBean, deber respetar ciertas convenciones de nombrepara respetar la utilizacin, la reutilizacin, la sustitucin y la conexin JavaBean. La clase debe serserializable (para guardar y leer). La clase debe tener un constructor por defecto (sin argumento).Las propiedades de los mtodos deben ser accesibles a travs de los mtodos (descriptores deacceso). La nica diferencia real entre un POJO y un JavaBean es la posibilidad de los JavaBeans degestionar eventos.

  • Con el modelo MVC, cada consulta HTTP debe ser enviada al controlador. La sintaxis del URI (Uniform

    Resource Identifier) indica al controlador qu comando debe ser ejecutado. Con Struts 2, una clase de

    accin puede ejecutar varias operaciones sobre el mismo principio que las MappingDispatchAction de

    Struts 1.

  • Cdigo: ejemplo01.Cliente.javapackage ejemplo01;

    import java.io.Serializable;

    @SuppressWarnings("serial")public class Cliente implements Serializable { private String identificador; private String contrasena; public Cliente() {

    } public String getIdentificador() { return identificador; } public void setIdentificador(String identificador) { this.identificador= identificador; }

    public String getContrasena() {

    Primer proyecto MVC

    Vamos a comenzar con un ejemplo simple de formulario de registro de un nuevo cliente (identificador

    y contrasea) y la visualizacin de los datos que ha introducido. La aplicacin se llamar ejemplo01. El

    usuario introducir un identificador y una contrasea, su informacin se mostrar en otra pgina

    despus de la creacin del usuario, sin persistencia de un objeto cliente.

    La aplicacin se compone de los siguientes elementos:

    Una clase llamada Cliente, que es un JavaBean.

    Un Servlet controlador llamado ServletControlador.

    Dos pginas JSP para las respectivas visualizaciones del formulario y de los datos

    introducidos.

    Una hoja de estilos llamada estilos.css para dar formato a las visualizaciones.

    rbol del proyecto ejemplo01

    El archivo fuente Cliente.java es una simple clase POJO.

  • return contrasena; }

    public void setContrasena(String contrasena) { this.contrasena= contrasena; }

    }

    Cdigo: ejemplo01.ServletControlador.javapackage ejemplo01;

    import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

    @SuppressWarnings("serial")public class ServletControlador extends HttpServlet { public void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException { // el uri tiene el siguiente formato /ejemplo01/Agregar_cliente.action String uri=request.getRequestURI(); // se utiliza el cdigo para dividir este URI int lastIndex=uri.lastIndexOf("/"); String action=uri.substring(lastIndex+1); System.out.println("ACCIN: "+action);

    // para las redirecciones String urlRetorno=null;

    // ejecutar la accin adaptada if (action.equals("Agregar_cliente.action")) { urlRetorno="/jsp/AgregarModificarCliente.jsp"; } else if (action.equals("ConfirmarAgregar_cliente.action")) { // instanciar el objeto Cliente cliente=new Cliente(); // actualizacin del objeto cliente.setIdentificador(request.getParameter("identificador")); cliente.setContrasena(request.getParameter("contrasena")); // devolver el objeto en la vista request.setAttribute("cliente", cliente); //pgina de visualizacin del cliente urlRetorno="/jsp/MostrarCliente.jsp"; }

    // redireccin a la vista adaptada if (urlRetorno!=null) { request.getRequestDispatcher(urlRetorno).forward(request,response); }

    El Servlet ServletControlador, hereda de la clase javax.servlet.http.HttpServlet y permite procesar

    consultas HTTP de tipo Post y Get. El cdigo de este Servlet es muy sencillo, analiza el URI, ejecuta la

    accin y la redireccin adaptada en consecuencia. Por ejemplo, si el URI

    esConfirmarAgregar_cliente.action, se crea un objeto cliente a partir de los datos introducidos en el

    formulario y se redirige al internauta a la pgina JSP MostrarCliente.jsp.

  • }

    public void doGet(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException { doPost(request, response); }}

    Cdigo: /jsp/AgregarCliente.jsp

    Agregar un cliente@import url(css/estilos.css);

    Agregar un cliente Identificador: Contrasea:

    Cdigo: /jsp/MostrarCliente.jsp

    Mostrar el cliente@import url(css/estilos.css);

    Informacin sobre el cliente: Identificador: ${cliente.identificador} Contrasea: ${cliente.contrasena}

    Por ltimo, las dos vistas son muy sencillas. Permiten mostrar el formulario de registro de un nuevo

    cliente (AgregarCliente.jsp) as como los datos de este mismo cliente (MostrarCliente.jsp).

    El archivo de configuracin de la aplicacin, tambin llamado descriptor de implementacin web.xml, es

    muy simple. Posee una sola definicin de Servlet que permite administrar todos los URI que terminan

    por .action. As, podremos administrar sin problemas nuestras

  • Cdigo: /WEB-INF/web.xml

    ServletControlador ejemplo01.ServletControlador ServletControlador *.action

    acciones Agregar_cliente.action yMostrar_cliente.action.

    El modelo *.action permite no escuchar todos los URI (*), lo cual sera intil para los recursosllamados estticos como los archivos JavaScript (.js), las imgenes u hojas de estilos CSS

    (.css). Por lo tanto, nuestro controlador general ignorar estos archivos.

    Podemos probar esta aplicacin con la siguiente URL:

    http://localhost:8080/ejemplo01/Agregar_Cliente.action

    Formulario de registro de un cliente ejemplo01

    Cuando el usuario confirma la creacin de un cliente, se ejecutar la siguiente URL:

    http://localhost:8080/ejemplo01/ConfirmarAgregar_cliente.action

  • Visualizacin de la informacin del cliente ejemplo01

  • Proyecto MVC con filtro

    La anterior aplicacin reposa sobre un Servlet de gestin que permite efectuar las acciones

    adaptadas en funcin de la solicitud del internauta. Los filtros permiten dar a una aplicacin una

    estructura modular. Permiten agrupar diferentes tareas que pueden ser imprescindibles para procesar

    las consultas. La principal funcin de un Servlet es la de recibir las consultas y responder a los clientes

    afectados.

    Por contra, a menudo es necesario realizar una funcin idntica para cada Servlet en relacin con las

    consultas y las respuestas HTTP. Queremos enrutar o transportar un parmetro que se encuentra en

    todas las consultas sin estar obligado a escribir el cdigo para cada Servlet... La interfaz Filter que

    viene incluida con el API Servlet 2.3 permite resolver este tipo de problema.

    Los filtros permiten procesar:

    las consultas procedentes de los clientes antes de que sean procesadas por los Servlets;

    las respuestas procedentes de los Servlets antes de que no sean devueltas a los clientes.

    Podemos, por ejemplo:

    descifrar las consultas enviadas a los Servlets, procesar los datos con los Servlets y cifrar las

    respuestas para los clientes;

    gestionar la autenticacin de los clientes;

    convertir los formatos de imgenes, aplicar transformaciones XSLT a los datos XML u otros.

    Para utilizar un filtro es necesario realizar dos operaciones. La primera consiste en escribir una clase

    que implemente la interfaz Filter. La segunda consiste en modificar el descriptor de implementacin

    (archivo web.xml) de la aplicacin para indicar al contenedor que utilice el filtro.

    Cuando se ha creado un filtro, el contenedor llama a su mtodo init(...). En este mtodo, podemos

    acceder a los parmetros de inicializacin con la interfaz FilterConfig. Durante el procesamiento de la

    consulta, el contenedor llama al mtodo doFilter(...). Por ltimo, antes de destruir el filtro, el

    contenedor llama su mtodo destroy(...).

    Cuando el filtro llama al mtodo chain.doFilter(), se ejecuta el siguiente filtro de la cadena. El

    cdigo situado antes de chain.doFilter() se ejecuta antes del procesamiento del Servlet. Cualquier

    modificacin que deba realizarse en el filtro antes de la ejecucin de la consulta debe efectuarse

    antes de esta llamada. El cdigo situado despus de esta llamada se ejecuta despus del

    procesamiento del Servlet. Tambin es posible encadenar los filtros y utilizar un filtro para un

    procesamiento especfico.

    El siguiente esquema presenta el funcionamiento de un filtro antes y despus del procesamiento por

    el Servlet invocado.

  • ...

    filtroregistro cajaherramientas.FiltroRegistro

    ...

    ...

    filtroregistro servletautenticacion

    ...

    ServletControlador ejemplo01.ServletControlador

    Estructura de un filtro Java EE

    El descriptor de implementacin web.xml permite indicar el o los filtros que se ejecutarn para cada

    Servlet o URL. El primer elemento permite declarar la clase asociada al filtro. Este elemento

    debe colocarse al principio del archivo de configuracin despus de la declaracin de variables

    globales al contexto ().

    En nuestro caso, decidimos un filtro asociado a la clase FiltreJournalisation que permite gestionar

    el acceso a las pginas del sitio.

    El segundo elemento necesario es . Permite, como para los Servlets, administrar el

    mapping (las relaciones) entre un nombre y un Servlet o una URL. Por ejemplo, aqu el filtro se aplica

    nicamente al Servlet servletautenticacion.

    Con la utilizacin de un filtro, podremos ofrecer a cada recurso (dinmicos y estticos) de nuestra

    aplicacin un nico controlador (un Servlet). Con el anterior ejemplo de descriptor de

    implementacinweb.xml, slo los URI con el sufijo .action sern procesados por nuestro Servlet. No

    gestionaremos los recursos estticos, como por ejemplo las imgenes, archivos JavaScript u hojas de

    estilos.

  • ServletControlador *.action

    Cdigo: ejemplo01.FiltroControlador.javapackage ejemplo01;

    import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

    @SuppressWarnings("serial")public class FiltroControlador implements Filter {

    private FilterConfig filterConfig;

    public void init(FilterConfig filterConfig) throwsServletException { this.filterConfig=filterConfig; }

    public void doFilter(ServletRequest req, ServletResponseresp,FilterChain filterChain)throws IOException, ServletException { // conversin HttpServletRequest request=(HttpServletRequest)req; HttpServletResponse response=(HttpServletResponse)resp; // el uri tiene el siguiente formato /ejemplo01-2/Agregar_cliente.action String uri=request.getRequestURI(); // utilizamos el cdigo para dividir este URI int lastIndex=uri.lastIndexOf("/"); String action=uri.substring(lastIndex + 1); System.out.println("ACCIN: "+action+" con un filtro");

    // para las redirecciones String urlRetorno=null;

    // ejecutar la accin adaptada if (action.equals("Agregar_cliente.action")) { urlRetorno="/jsp/AgregarCliente.jsp"; } else if (action.equals("ConfirmarAgregar_cliente.action")) {

    El funcionamiento de un filtro es diferente, cada recurso es procesado en la

    funcinfilterChain.doFilter() que sean las consultas o los elementos estticos. La principal ventaja es la

    capacidad tanto de gestionar los recursos estticos como de prohibir el acceso directo.

    La nueva aplicacin se llamar ejemplo01-2. Este proyecto est basado en el anterior, pero el archivo

    de configuracin de la aplicacin web.xml utiliza en este caso un filtro en su lugar e introduce una

    definicin de Servlet.

    La clase Cliente y las pginas JSP son idnticas; sin embargo, vamos a desarrollar un filtro al que

    llamaremos FiltroControlador en lugar del archivo ServletControlador.

  • // instanciar el objeto Cliente cliente=new Cliente(); // actualizacin del objeto cliente.setIdentificador(request.getParameter("identificador")); cliente.setContrasena(request.getParameter("contrasena")); // devolver el objeto en la vista request.setAttribute("cliente", cliente); //pgina de visualizacin del cliente urlRetorno="/jsp/MostrarCliente.jsp"; }

    // redireccin a la vista adaptada if (urlRetorno!=null) { request.getRequestDispatcher(urlRetorno).forward(request,response); } // para los recursos estticos else { filterChain.doFilter(request, response); } }

    public void destroy() { this.filterConfig=null; }

    }

    Cdigo: /WEB-INF/web.xml

    FiltroControlador ejemplo01.FiltroControlador FiltroControlador /*

    El cdigo del controlador es idntico desde el punto de vista algortmico. El internauta puede

    visualizar el formulario de creacin y despus de la confirmacin, visualizar sus datos a travs de un

    objeto cliente. El cdigo del descriptor de implementacin se modifica para declarar un filtro a la

    escucha de las consultas.

    Podemos utilizar esta aplicacin con la siguiente URL para agregar un cliente:

    http://localhost:8080/ejemplo01-2/Agregar_cliente.action

  • Consola y registros del filtro

  • En resumen

    En este captulo se ha presentado el mecanismo de desarrollo Web en Java con el modelo de diseo

    MVC Modelo Vista Controlador. Tambin hemos observado dos tcnicas de programacin. La primera

    utiliza el principio de mapping de los URI para interceptar las consultas HTTP con la ayuda de un

    Servlet controlador. La segunda introduce el mecanismo de filtro destacado en Struts 2. En el

    siguiente captulo, escribiremos nuestra primera aplicacin con el framework Struts 2.

  • Presentacin

    Este captulo presenta el framework Struts 2 a travs de un ejemplo concreto para acelerar y facilitar

    el desarrollo de aplicaciones Web.

    A partir de este punto del libro, se utilizar el trmino Struts para hacer referencia a Struts 2.

    Las aplicaciones de Struts tienen un archivo de configuracin llamado struts.xml. Este archivo de

    configuracin es el ms importante y sustituye a la definicin de los Servlets en el descriptor de

    implementacin web.xml. Este archivo permite administrar la configuracin de las acciones que se van

    a realizar.

    Struts tambin tiene un archivo de propiedades presente por defecto en el archivo de la

    aplicacinstruts2-core-version.jar llamado default.properties. Este archivo utilizado por defecto contiene

    los textos de validacin (mensajes de error y de confirmacin) y los parmetros de configuracin de

    Struts. Este archivo predeterminado es suficiente para comenzar con una aplicacin simple (en ingls).

    Como ya hemos dicho en el captulo anterior, Struts utiliza un filtro para realizar el enrutamiento hacia

    un solo controlador de administracin correspondiente al modelo MVC II. El controlador de Struts es

    capaz de:

    Determinar el URI para la accin que se va a ejecutar.

    Utilizar una clase de accin.

    Ejecutar el mtodo de accin de la clase si est asociada.

    Si se han introducido datos, crear un objeto y actualizarlo o posicionar los valores de los

    parmetros.

    Regresar a la vista (pgina JSP) para mostrar la respuesta.

    Gracias a la utilizacin de un filtro y de un controlador global, no hemos escrito un controlador

    complejo para cada servicio (por ejemplo, administracin de clientes, de artculos...) para administrar

    el enrutamiento de la aplicacin. Lo ms importante para el desarrollador es administrar las acciones

    asociadas a una demanda especfica.

  • Cdigo: /WEB-INF/web.xml

    Struts Blank

    struts2 org.apache.struts2.dispatcher.FilterDispatcher

    struts2 /*

    Cdigo: struts.xml...

    ...

    Funcionamiento general de Struts 2

    Struts utiliza un filtro como en el caso de la aplicacin ejemplo01-2. Este filtro debe estar declarado en

    el descriptor de implementacin de nuestra aplicacin web.xml. Este filtro se define en la

    claseorg.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.

    Con Struts, el mtodo de accin de la clase se ejecuta despus de que todas las propiedades hayan

    sido procesadas y afectadas. Por su parte, un mtodo de accin devuelve una cadena de caracteres

    de tipo String. Esta cadena indica a Struts donde debe redirigirse al controlador. Por ejemplo, la

    cadena success indica a Struts que regrese a la pgina en caso de que el procesamiento haya sido

    correcto y la cadena error determina la pgina que se mostrar en caso de error.

    En la mayora de los casos, Struts redirige al usuario a una vista JSP con la ayuda de la

    interfazRequestDispatcher de Java. En general, las vistas devueltas estn en formato JSP, pero

    tambin pueden ser modelos de Velocity o FreeMarker. Adems, Struts tambin puede devolver un

    flujo multimedia de tipo imagen, por ejemplo.

    Para probar y analizar los URI, Struts utiliza el archivo de configuracin llamado struts.xml. Este

    archivo de configuracin debe colocarse en el directorio /WEB-INF/src (o /WEB-INF/classes despus de

    la compilacin) para que funcione por defecto. Todas las acciones se declararn en el archivo de

    enrutamiento y a cada declaracin de accin le corresponde un nombre de URI. Este archivo de

    configuracin struts.xml se lee al iniciar la aplicacin. Podemos, para simplificar y para evitar volver a

    cargar el administrador, declarar la aplicacin en modo de desarrollo. Con esta modalidad de diseo,

    el archivo se volver a cargar cada vez que haya un cambio en la aplicacin. Con esta etiqueta, no es

    necesario recargar el contenedor.

    Cada declaracin de accin esta asociada a una clase completamente cualificada

    (nombrepaquete.nombreclase). En caso contrario, podemos definir una accin de Struts por defecto.

    Una clase de accin deber tener al menos un tipo de cadena de caracteres, pero tambin puede

    tener varios (confirmacin, error, consulta, lista...).

    A la hora de acceder a un recurso o de ejecutar una accin, Struts utiliza este proceso de llamada:

  • Proceso de ejecucin de Struts

    1) El cliente enva consultas desde URL adaptadas. Tambin puede enviar parmetros dentro de la

    URL o mediante un formulario.

    2) Struts consulta su archivo de configuracin struts.xml para encontrar la configuracin de la accin.

    3) Se ejecuta cada interceptor asociado a la accin. Uno de estos interceptores es el encargado de

    asignar automticamente los valores recibidos en la consulta con las propiedades de la clase de

    accin, en funcin de los nombres (por ejemplo, identificador, contrasena).

    4) Struts ejecuta el mtodo en de accin asociada a la clase.

    5) Se devuelve el resultado adaptado al usuario solicitante.

    Los interceptores son se ponen en marcha despus de que se ejecute el mtodo de la accin,lo que permite a estos mismos interceptores ejecutar las operaciones sobre los parmetros

    despus del procesamiento del mtodo de accin.

  • Los interceptores de Struts 2

    Un interceptor de Struts es un filtro que puede efectuar distintos procesamientos sobre una accin. El

    cdigo presente en un interceptor es modulable y puede aadirse o suprimirse directamente en el

    archivo de configuracin struts.xml. Tambin es posible aadir cdigo especifico a una aplicacin sin

    recompilar el framework principal.

    En este punto del libro, es necesario comprender que un interceptor es un filtro que tiene una funcin

    especfica y permite, por ejemplo, administrar las cookies, los parmetros HTTP, la depuracin, la

    carga de archivos (upload) o incluso los alias de las acciones.

  • ...

    HelloWorld /example

    El archivo de configuracin struts.xml

    Una aplicacin de Struts tiene un archivo de configuracin struts.xml el formato XML y el archivo de propiedades

    predeterminado default.properties, pero tambin puede tener otros archivos de configuracin.

    Es posible que no haya ningn archivo de configuracin en una aplicacin de Struts. A este tipo de programacin se le conocecomo configuracin cero (zero configuration). Esta tcnica utiliza las anotaciones Java en las clases para no declarar las

    acciones en un archivo de configuracin.

    En el archivo struts.xml vamos a definir la configuracin general de la aplicacin:

    Los parmetros de configuracin de Struts.

    Las acciones.

    Los interceptores.

    Los resultados de las acciones.

    El archivo de configuracin struts.xml siguiente se incluye con la aplicacin struts-blank.war.

    1. La etiqueta

    Las acciones de Struts se reagrupan por paquete segn un principio semejante al de los paquetes Java. En el ejemplo anterior, el

    paquete se llama default.

    Una etiqueta debe tener un atributo name para hacer referencia al paquete. El atributo opcional namespace posee el valor

    por defecto /. Este espacio de nombre siempre se aade a los URI que ejecutan las acciones del paquete.

    Los atributos de la etiqueta son los siguientes:

    name: atributo obligatorio que determina el nombre del paquete.

    namespace: atributo que determina el espacio de nombre para todas las acciones del paquete.

    extends: atributo obligatorio que determina el paquete padre que se va a heredar.

    abstract: atributo poco utilizado que determina si el paquete puede ser heredado o no.

    Para invocar un URI se utiliza el siguiente modelo: /contextoaplicacion/nombreaccion.action (o nombreaccion.do).

    Ahora, para invocar una accin en un espacio de nombre, debemos utilizar la siguiente sintaxis:

    /contextoaplicacion/espaciodenombre/nombreaccion.action (o nombreaccion.do)

    Por ejemplo, para ejecutar la parte administrativa del proyecto ejemplo01 definida como sigue, utilizamos el siguiente URI:

    http://localhost:8080/ejemplo01/admin

    La etiqueta debe,

    en la mayora de los casos,

    extender el paquete struts-

    default definido en el

    archivo struts-default.xml. En

    este caso, todas las acciones

    pueden utilizar los

    interceptores declarados en el

    archivo struts-default.xml. Los

    desarrolladores pueden crear

  • ... ...

    Cdigo: struts.xml

    Cdigo: frontoffice.xml

    HelloWorld /example

    sus propios paquetes

    heredando de este paquete

    predeterminado que pone a

    disposicin la mayora de los

    interceptores tiles para la

    programacin de aplicaciones de Internet.

    2. La etiqueta

    Como ya hemos mencionado, el archivo de configuracin de Struts se llama struts.xml. En una aplicacin compleja, podemos tener

    varios paquetes y una gran cantidad de lneas en este archivo de configuracin. Para mejorar la administracin y el mantenimiento

    de este archivo, es posible dividir este archivo en varios sub-archivos. Cada sub-archivo se incluye en este archivo principal. La

    etiqueta permite dividir el archivo principal en varios sub-archivos. Idealmente, cada sub-archivo define su propio

    paquete.

    Mayscula inicial por ejemplo, podemos dividir el archivo de configuracin de la aplicacin por las partes frontoffice y backoffice del

    sitio. Cada archivo incluido debe utilizar la misma gramtica (DOCTYPE) y la etiqueta raz del documento .

    3. La etiqueta

    La etiqueta se utiliza con una etiqueta y representa a la accin proporcionada por el paquete. Una accin

    debe tener un nombre. El nombre es eleccin del desarrollador, pero debe ser lo ms explcito posible para mejorar el

    mantenimiento. Una accin est, en general, asociada a una clase, pero esto no es obligatorio para las redirecciones. Una accin

    que no precisa de clase utiliza una instancia de la clase por defecto, ActionSupport.

    La sintaxis es la siguiente:

    Por contra, si se ha definido una clase, el nombre de la clase debe estar completamente cualificado (nombrepaquete.nombreclase).

    Tambin podemos especificar el nombre del mtodo de la clase que debe ejecutarse al inicio de la accin.

    La sintaxis es la siguiente:

    Si el atributo class est presente en la definicin, pero solamente se ha precisado el atributomethod, por defecto se utilizar el

    mtodo execute() de la clase al inicio de la accin.

    Por lo tanto, las siguientes declaraciones son idnticas:

  • /jsp/AgregarCliente.jsp /jsp/Mostrar.jsp

    /jsp/mostrarcliente.jsp

    /jsp/mostrarcliente.jsp

    jlafosse

    Cdigo: struts.xml

    ...

    4. La etiqueta

    La etiqueta se utiliza en el interior de una etiqueta como sub-elemento. Esta etiqueta permite indicar a Struts

    donde devolver el resultado de la accin. Una accin puede devolver varios resultados (todos diferentes), por lo tanto puede tener

    varias etiquetas , cada una correspondiente a un resultado posible. Por ejemplo, una accin puede devolver una pgina

    de error en caso de existir un problema de sintaxis en los datos introducidos (input) o una pgina de confirmacin para mostrar el

    resultado (con success).

    El siguiente es un ejemplo de configuracin para nuestro proyecto de creacin de una cuenta de cliente a partir del identificador y de

    la contrasea:

    Se ejecutar el primer

    resultado si el

    mtodo agregar() devuelve la

    cadena de caracteres success.

    En este caso, se mostrar la

    pgina Mostrar.jsp en el

    navegador. Se ejecutar el

    segundo resultado si el mtodo agregar() devuelve la cadena de caracteres input cuando se produce un error en la introduccin de

    datos. En este caso, se muestra la pgina de introduccin de datos de nuevo sin perder los datos.

    El atributo type de la etiqueta , determina el tipo de resultado que se va a devolver. Este tipo debe especificarse en el

    paquete o un paquete heredado. En el caso de una redireccin, por ejemplo, se define el tipo dispatcher en el paquete struts-default.

    Si no utilizamos el atributo type en la etiqueta , el valor dispatcher (redireccin) se utiliza por defecto. Si no utilizamos el

    atributo name en la etiqueta , el valor success se utiliza por defecto.

    Por lo tanto, las siguientes declaraciones son idnticas:

    Si un mtodo de unaclase de accin

    devuelve un resultado queno est presente en unaetiqueta de la

    accin, Struts buscar entonces un resultado correspondiente en el grupo . Esta etiqueta permite realizaragrupaciones de etiquetas para evitar las definiciones repetitivas. En esta etiqueta, por ejemplo, podemos encontrar lasredirecciones hacia la pgina de inicio del sitio, la pgina de error, de autenticacin o de administracin.

    5. La etiqueta

    La etiqueta puede utilizarse con los elementos , e para asignar un valor al

    objeto afectado. La etiqueta posee un atributoname para nombrar el valor.

    Si se utiliza con una accin, la etiqueta permite asignar un valor a una propiedad.

    Por ejemplo, el identificador por efecto para el cliente se determina con la etiqueta .

    6. La etiqueta

    El archivo de configuracin struts.xml puede estar asociado opcionalmente con el archivo de propiedades struts.properties. Podemos

    crear parejas de claves/valores para modificar los valores predeterminados definidos en el archivo default.properties incluido con el

    paquete struts2-core-version.jar.

    Para modificar o sobrecargar un valor del archivo default.properties sin utilizar el archivostruts.properties, podemos utilizar la

    etiqueta en el archivo struts.xml.

    La etiqueta posee los atributos name y value. Por ejemplo, para utilizar Struts en modo de desarrollo para la

    administracin de los registros y depuraciones, podemos utilizar la siguiente configuracin:

    7. La etiqueta

    La etiqueta se utiliza para definir los resultados generales. Si una accin no encuentra definicin de resultado en

    su propia definicin, Struts entonces busca un resultado en la definicin de esta etiqueta. La declaracin de los resultados en esta

    etiqueta es idntica a la declaracin presente en las acciones.

  • /jsp/mostrarcliente.jsp

    /jsp/mostrarcliente.jsp

    /vistas/usuarios/index.jsp admin/Admin.action

    Si Struts no encuentra ninguna correspondencia de resultado, de manera local o en la etiqueta, se produce una

    excepcin.

    8. La etiqueta

    La etiqueta se utiliza para definir a los interceptores (una especie de filtro). Como ya se ha explicado, una accin

    puede contener una lista de interceptores que operarn sobre las acciones. Antes del poder utilizar un interceptor, debemos

    declararlo en la etiqueta.

    Por ejemplo, el siguiente cdigo registra dos interceptores: confirmacin (para las confirmaciones del usuario) y alias (para la

    administracin de los parmetros).

    Ahora que ya se han

    registrado los interceptores,

    podemos utilizarlos con la

    etiqueta que es un sub-elemento

    de la etiqueta .

    A continuacin se muestra un

    ejemplo de la utilizacin de los interceptores anteriores:

    El orden dedeclaracin de los

    interceptores tiene una granimportancia. De hecho,determina el orden deejecucin de losinterceptores para cadaaccin. En el ejemploanterior, el interceptorconfirmacin se ejecutar enprimer lugar seguido deinterceptor alias.

    Para evitar la repeticin de declaraciones de interceptores, Struts ofrece la posibilidad de crear grupos de interceptores. El

    desarrollador ya no tendr necesidad de realizar mltiples referencias para cada etiqueta que utiliza estos interceptores.

    A continuacin se muestra un ejemplo de definicin de un grupo de interceptores:

    Para hacer referencia a un

    grupo de interceptores, basta

    con agregar la

    etiqueta y

    el atributo name dentro de una

    accin.

    El paquete struts-

    default definir varios grupos de

    interceptores. La

    etiqueta especifica

    el grupo de interceptores por

    defecto.

    Si una accin necesita utilizar otros interceptores distintos a los definidos por defecto, podemos redefinir el grupo de interceptores

    por defecto. El interceptor params es el ms importante, ya que permite administrar la copia y el acceso automtico a los datos de los

    parmetros de la consulta, en nuestras acciones y para los JavaBeans utilizados. A continuacin, se presenta una lista de los

    interceptores de Struts utilizados por defecto:

  • dojo\..* input,back,cancel,browse input,back,cancel,browse

  • Arquitectura de Struts 2

    El esquema arquitectnico siguiente presenta el funcionamiento del framework basado en la

    utilizacin de interceptores y de propiedades de JavaBeans.

    Arquitectura de Struts 2

    1) El cliente enva consultas hacia un servicio de la aplicacin con los parmetros eventuales.

    2) Se consulta el archivo de configuracin de la aplicacin o las anotaciones de clases.

    3) Los interceptores asociados a la accin se ejecutan y realizan los servicios asociados (conservar los

    parmetros, administrar las sesiones, guardar los mensajes de error...). El interceptor params asignan

    los valores presentes en la consulta a la clase de accin asociada por medio de sus descriptores de

    acceso y ejecutar el mtodo de procesamiento (execute() predeterminado).

    4) La vista que se mostrar se selecciona de acuerdo con el archivo de configuracin struts.xml o la

    anotacin correspondiente.

    5) La clase de accin transmite los datos necesarios a la vista.

    6) La vista muestra al cliente los resultados procesados.

  • Los archivos de propiedades struts.properties ydefault.properties

    Para administrar la configuracin de Struts, podemos utilizar las etiquetas presentes en

    el archivo de configuracin struts.xml como se ha indicado anteriormente, o bien utilizar un

    archivostruts.properties.

    Para ello, debemos crear un archivo struts.properties en la carpeta /WEB-INF/src (o /WEB-INF/classes)

    de la aplicacin y sobrecargar los valores para las parejas claves/valores (principio de los archivos de

    propiedades a Java). Estos valores por defecto se presentan en el archivo default.properties presente

    en el paquete struts2-core-version.jar.

    Para volver a tomar el ejemplo, podemos utilizar Struts en modo de depuracin en el

    archivostruts.properties:

    struts.devMode=true

    Los valores predeterminados de las propiedades del archivo default.properties se detallan a

    continuacin:

    struts.i18n.encoding=UTF-8: codificacin predeterminada utilizada por Struts.

    struts.objectFactory=spring: el objeto Factory utilizado por defecto por Struts.

    struts.objectFactory.spring.autoWire=name: el valor utilizado por defecto cuando utilizamos el objeto

    SpringObjectFactory. Los valores posibles son: name, type, auto y constructor.

    struts.objectFactory.spring.useClassCache=true: este parmetro permite indicar si las instancias de la

    integracin de Struts-Spring deben almacenarse en el cach.

    struts.objectFactory.spring.autoWire.alwaysRespect=false: este parmetro permite administrar la

    estrategia del autowire.

    struts.objectTypeDeterminer=notiger: este parmetro permite administrar la implementacin de la

    clasecom.opensymphony.xwork2.util.ObjectTypeDeterminer.

    struts.multipart.parser=jakarta: este parmetro permite especificar el analizador utilizado por las

    consultas multi-parte (upload).

    struts.multipart.saveDir: este parmetro permite especificar la carpeta por defecto para la carga de

    archivos.

    struts.multipart.maxSize=2097152: este parmetro permite especificar el tamao mximo para los

    archivos que se cargan.

    struts.custom.properties=application,org/apache/struts2/extension/custom: este parmetro permite

    especificar la lista de archivos de propiedades que deben cargarse.

    struts.mapper.class=org.apache.struts2.dispatcher.mapper.DefaultActionMapper: este parmetro permite

    precisar cmo se asignan las URL a las acciones. El valor por defecto de este parmetro es:

    org.apache.struts2.dispatcher.mapper.DefaultActionMapper.

    struts.action.extension=action: este parmetro permite administrar por una lista separada por comas,

    la lista de extensiones para las acciones (por ejemplo, .action, .do).

    struts.serve.static=true: este parmetro indica si Struts debe administrar los contenidos estticos

    presentes en los archivos .jar.

    struts.serve.static.browserCache=true: este parmetro indica si el filtro utilizado por Struts debe o no

    almacenar en el cach del navegador del cliente, los contenidos estticos (imgenes, css,

    javascript...).

    struts.enable.DynamicMethodInvocation=true: este parmetro indica si la invocacin de mtodos

    dinmicos es posible con Struts. Las invocaciones dinmicas consisten en crear URI de la siguiente

    forma: agregar!Cliente.action.

  • El valor por defecto es true pero por motivos de seguridad, podemos pasarlo a false si no utilizamos

    ninguna invocacin dinmica.

    struts.enable.SlashesInActionNames=false: este parmetro indica si se autoriza o no el uso de barras

    en los nombres de las acciones.

    struts.tag.altSyntax=true: este parmetro indica si se autoriza o no el uso de expresiones regulares %

    {}.

    struts.devMode=false: este parmetro indica si nos encontramos en modo de desarrollo o no. Cuando

    este parmetro tiene el valor true, el archivo de configuracin struts.xml se recarga as como los

    archivos de confirmacin y los mensajes de propiedades (bundles). Esto significa que no necesitamos

    volver a cargar la aplicacin cada vez que se realice una modificacin de un archivo esttico. Asimismo,

    este parmetro permite una visualizacin en modo detallado de la depuracin. Sin embargo, el modo

    de produccin este parmetro debe establecerse como false para evitar mostrar las excepciones y

    reducir la memoria.

    struts.i18n.reload=false: este parmetro permite precisar si los archivos de lenguas (bundles) deben

    ser recargados para cada consulta. Este principio es muy til en la fase de desarrollo, pero no debe

    ser utilizado en un servidor de produccin.

    struts.ui.theme=xhtml: este parmetro permite precisar el tema utilizado por defecto con la biblioteca

    de etiquetas de Struts.

    struts.ui.templateDir=template: este parmetro permite especificar la ruta de las plantillas (templates).

    struts.ui.templateSuffix=ftl: este parmetro permite especificar el tipo de plantilla determinado. El valor

    predeterminado corresponde a la plantilla propuesta por FreeMarker (ftl), aunque tambin estn

    disponibles Velocity (vm) y JSP (jsp).

    struts.configuration.xml.reload=false: este parmetro indica si los archivos de configuracin en formato

    XML deben ser recargados (struts.xml y los archivos eventuales incluidos).

    struts.velocity.configfile=velocity.properties: este parmetro permite especificar el archivo de

    configuracin predeterminado para el motor de plantillas Velocity.

    struts.velocity.contexts=: este parmetro permite declarar una lista de clases que puede utilizarse por

    el contexto Velocity.

    struts.velocity.toolboxlocation=: este parmetro permite declarar la ruta de la caja de herramientas

    Velocity.

    struts.url.http.port=80: este parmetro permite especificar el puerto utilizado para las consultas y URL

    HTTP.

    struts.url.https.port=443: este parmetro permite especificar el puerto utilizado por las consultas y

    URL HTTPS.

    struts.url.includeParams=none: este parmetro permite especificar si los parmetros se incluyen en la

    URL.

    struts.custom.i18n.resources=testmessages,testmessages2: este parmetro permite cargar los

    archivos de mensajes (bundles) por defecto.

    struts.dispatcher.parametersWorkaround=false: este parmetro indica si la

    funcinHttpServletRequest.getParameterMap() debe activarse o no.

    struts.freemarker.manager.classname=org.apache.struts2.views.freemarker.FreemarkerManager: este

    parmetro permite especificar la clase que utilizar FreeMarker.

    struts.freemarker.templatesCache=false: este parmetro permite especificar si el motor de FreeMarker

    debe utilizar el cach o no.

    struts.freemarker.beanwrapperCache=false: este parmetro permite especificar si el cache de los beans

    debe ser utilizado uno con FreeMarker.

    struts.freemarker.wrapper.altMap=true: este parmetro permite precisar si el mapping est autorizado

    con FreeMarker.

  • struts.freemarker.mru.max.strong.size=100: este parmetro permite configurar el tamao mximo para

    el cach de FreeMarker.

    struts.xslt.nocache=false: este parmetro permite especificar si los resultados XSLT deben utilizar el

    cach.

    struts.mapper.alwaysSelectFullNamespace=false: este parmetro indica si Struts debe utilizar o no el

    nombre de espacio antes de la ltima barra.

  • Cdigo: /WEB-INF/web.xml

    struts2 org.apache.struts2.dispatcher.FilterDispatcher

    struts.devMode true struts2 /* ...

    El archivo de propiedades de la aplicacin web.xml

    Para la administracin de la configuracin de Struts, podemos utilizar las etiquetas y el

    archivo struts.properties. Existe tambin una ltima manera de configurar Struts, por medio del archivo

    de descripcin de la aplicacin web.xml.

    Para ello, debemos utilizar las constantes de inicializacin del filtro con la siguiente sintaxis:

  • ... ...

    ...

    El archivo de configuracin struts-default.xml

    En el archivo struts-default.xml presente en el archivo struts2-core-version.jar, estn definidos los

    resultados predeterminados y los interceptores. Por este motivo, podemos utilizar este archivo por

    defecto sin volverlo a escribir en nuestro archivo struts.xml para que sea ms pequeo y legible.

    La estructura del archivo struts-default.xml es la siguiente:

  • Cdigo: /WEB-INF/web.xml

    Struts Blank

    struts2 org.apache.struts2.dispatcher.FilterDispatcher

    Nuestra primera aplicacin con Struts

    Vamos a retomar nuestra aplicacin de administracin de clientes con el identificador y la contrasea

    para adaptarla a Struts.

    rbol del proyecto ejemplo02

    El descriptor de implementacin web.xml contiene nicamente la declaracin de la utilizacin del

    framework Struts.

  • struts2 /*

    Cdigo: struts.xml

    /jsp/AgregarCliente.jsp

    /jsp/MostrarCliente.jsp

    Cdigo: ejemplo02.Cliente.javapackage ejemplo02;

    import java.io.Serializable;

    @SuppressWarnings("serial")public class Cliente implements Serializable {

    private String identificador; private String contrasena;

    public String getIdentificador() { return identificador; }

    public void setIdentificadort(String identificador) { this.identificador= identificador; }

    El archivo de configuracin del enrutamiento struts.xml se presenta a continuacin. Nos encontramos

    con las acciones posibles, que son Agregar_Cliente.action y ConfirmarAgregar_Cliente.action. Utilizamos

    igualmente dos constantes para suprimir las invocaciones dinmicas y para pasar al modo de

    desarrollo. Tambin nos encontramos con la definicin del paquete con el nombre ejemplo02. La

    accinAgregar_Cliente.action realiza una simple redireccin a la vista JSP de aadido. La

    accinConfirmarAgregar_Cliente.action utiliza la clase Cliente, pero como el parmetro mtodo no est

    definido en la accin, por defecto se llamar al mtodo execute().

    Ahora, podemos presentar la clase de accin llamada Cliente. Esta clase utilizar las dos propiedades

    del formulario, el identificador y la contrasea. Este archivo es una simple clase POJO. Cada propiedad

    posee descriptores de acceso que sern reasignados automticamente durante la llamada de la

    accin gracias al interceptor params. As, los mtodos setIdentificador() y setContrasena() sern

    ejecutados y afectados por Struts.

  • public String getContrasena() { return contrasena; }

    public void setContrasena(String contrasena) { this.contrasena= contrasena; }

    public String execute() { System.out.println("En el mtodo de la accin"); return "success"; }}

    Cdigo: /jsp/AgregarCliente.jsp

    Agregar un cliente@import url(css/estilos.css);

    Agregar un cliente Identificador: Contrasea:

    Cdigo: /jsp/MostrarCliente.jsp

    Mostrar el cliente@import url(css/estilos.css);

    Gracias a Struts, ya no hay necesidad de administrar las recuperaciones de los parmetros en la

    consulta (request.getParameter() o request.getAttribute()), ni de administrar los reenvos de los de

    parmetros en la respuesta (request.setAttribute()). El simple hecho de utilizar los descriptores de

    acceso de cada propiedad permite administrar los parmetros de manera global.

    La pgina JSP /jsp/AgregarCliente.jsp tiene la siguiente estructura:

    Por ltimo, el archivo JSP /jsp/MostrarCliente.jsp tiene la siguiente estructura:

  • Informacin sobre el cliente: Identificador: Contrasea:

    Especificamos la utilizacin de la biblioteca de etiquetas de Struts con la siguiente lnea:

    Por ltimo, cada propiedad es accesible con la etiqueta Struts gracias a los getters de

    la clase de accin.

    Podemos utilizar esta aplicacin, con la siguiente URL para agregar un cliente:

    http://localhost:8080/ejemplo02/Agregar_cliente.action

    Formulario de ejemplo02

  • Visualizacin del cliente de ejemplo02

    Nuestra primera aplicacin con Struts ya esta operativa. Permite administrar dos atributos presentes

    en un formulario. La simple declaracin de los descriptores de acceso permite administrar toda la

    cadena de desarrollo (consulta/respuesta). Para probarlo, podemos simplemente suprimir el

    settersetContrasena() en la clase Cliente y comprobar el resultado.

    Visualizacin del cliente sin el setter de la contrasea

  • En resumen

    Este captulo ha presentado el funcionamiento general de Struts con los interceptores, el archivo de

    configuracin de la aplicacin struts.xml y las distintas etiquetas XML de declaracin. Tambin se han

    detallado los archivos de configuracin del framework y se ha explicado en profundidad un primer

    ejemplo de administracin de clientes.

  • Cdigo: ejemplo02.Cliente.javapackage ejemplo02;

    import java.io.Serializable;

    @SuppressWarnings("serial")public class Cliente implements Serializable {

    private String identificador; private String contrasena;

    ...

    public String execute() { System.out.println("En el mtodo de la accin"); return "success"; }}

    Cdigo: ejemplo02.log4j.properties#definicin del nivel y de los Appender del rootLogger (orden: DEBUG- INFO - WARN - ERROR - FATAL)log4j.logger.freemarker=OFFlog4j.logger.com.opensymphony.xwork2=OFFlog4j.logger.org.apache=INFOlog4j.rootLogger=DEBUG

    Presentacin

    En el captulo anterior se ha presentado un primer proyecto simple de Struts. El mtodo execute() de

    la clase de accin Cliente muestra un registro en la consola de Java con la ayuda del

    mtodoSystem.out.println().

    Registro de Java

    Observamos que Struts es muy detallado, muestra varios registros de advertencia para una simple

    aplicacin. El framework reposa sobre la interfaz de registro Log4J (http://logging.apache.org/) y, por

    lo tanto, puede utilizar un archivo de configuracin para eliminar estos registros o adaptarlos segn

    nuestras necesidades.

    Estos registros corresponden a las herramientas FreeMarker y XWork. Para eliminarlos, basta con

    crear un archivo llamado log4j.properties en el directorio /WEB-INF/src (o /WEB-INF/classes) de la

    aplicacin al mismo nivel que el archivo de gestin struts.xml.

    El archivo de configuracin ms simple para detener los registros es el siguiente:

  • rbol y archivo log4j

    A continuacin, es necesario copiar el archivo de Log4J en formato .jar, log4j-version.jar en el directorio

    de bibliotecas de la aplicacin /WEB-INF/lib. Ahora podemos volver a ejecutar el proyecto y comprobar

    el registro en la consola Java.

    Registro de la consola Java con Log4J

    Podemos mostrar un nuevo formulario de registro de un cliente y confirmar la accin para visualizar el

    seguimiento sin registro.

    Registro de la consola Java sin Log4J

  • Cdigo: /jsp/MostrarCliente.jsp

    Mostrar el cliente@import url(css/estilos.css);

    ...

    Administracin de la depuracin

    Ahora, la depuracin es una operacin sencilla con Struts. El framework propone una etiqueta

    XHTML para mostrar los registros con la informacin de los parmetros, la sesin en curso

    o incluso los objetos.

    La etiqueta puede ubicarse en cualquier pgina JSP. Esta etiqueta posee un nico

    parmetro opcional llamado id.

    A continuacin, retomamos nuestra pgina MostrarCliente.jsp y aadimos esta etiqueta al principio del

    archivo.

    Luego, hacemos clic sobre el enlace llamado [debug], lo cual nos permite visualizar la pila de registros

    de los objetos presentes en el contexto de la aplicacin. Esta etiqueta permite depurar fcilmente una

    aplicacin al igual que visualizar las propiedades de la accin y el contenido de los objetos presentes

    en la sesin o en la coleccin de la aplicacin.

    Etiqueta de depuracin

  • Visualizacin de los registros de la depuracin

    En Struts, la depuracin se realiza mediante el interceptor debugging. Este interceptor est presente

    en la configuracin predeterminada de Struts. Podemos ejecutar este interceptor directamente a

    partir de una URL utilizando el parmetro debug=xml o debug=console. El parmetro debug=xmlpermite

    visualizar un rbol XML que contiene la lista de valores de registro y los objetos.

    A continuacin, se presenta un ejemplo con la ejecucin de la siguiente URL:

    http://localhost:8080/exemple02/ConfirmarAgregar_Cliente.accion?debug=xml

  • Visualizacin del rbol de depuracin XML

    Por ltimo, el seguimiento en modo consola permite visualizar una ventana con la informacin sobre la

    aplicacin en curso. En esta consola, podemos introducir expresiones de tipo Object-Graph Navigation

    Language (OGNL) para visualizar los parmetros de la pgina.

  • Consola de depuracin OGNL

    Esta consola no funciona actualmente con el navegador Internet Explorer, pero s con Firefox.

  • Cdigo: ejemplo02.Cliente.javapackage ejemplo02;

    import java.io.Serializable;import com.opensymphony.xwork2.util.profiling.UtilTimerStack;

    @SuppressWarnings("serial")public class Cliente implements Serializable {

    ... public String execute() { UtilTimerStack.setActive(true); System.out.println("En el mtodo de la accin"); return "success"; }}

    Cdigo: ejemplo02.Cliente.javapackage ejemplo02;

    import java.io.Serializable;import com.opensymphony.xwork2.util.profiling.UtilTimerStack;

    @SuppressWarnings("serial")public class Cliente implements Serializable { ... public String execute() {

    System.setProperty(UtilTimerStack.ACTIVATE_PROPERTY,"true"); System.out.println("En el mtodo de la accin"); return "success"; }}

    Administracin de la creacin de perfiles (Profiling)

    Struts incorpora por defecto una herramienta de administracin de la creacin de perfiles para

    nuestras aplicaciones. La creacin de perfiles permite dar informacin precisa sobre el curso de una

    accin. La creacin de perfiles permite, por ejemplo, mejorar el cdigo o encontrar una parte del

    cdigo particularmente lenta durante su ejecucin. Struts proporciona un seguimiento sobre el tiempo

    de ejecucin de las diferentes secciones, de sus filtros, interceptores y resultados. Cada uno de estos

    servicios utiliza la clase UtilTimeStack que se encuentra en el

    paquetecom.opensymphony.xwork2.util.profiling. Por defecto, no se mostrarn los registros. Por contra,

    si se ha activado el seguimiento para una accin, por ejemplo, el resultado se mostrar en modo de

    registro en la consola Java o en el archivo de registro del servidor Java EE (catalina.out para Tomcat).

    Para activar la creacin de perfiles con Struts, existen varias tcnicas:

    1) Ejecutar una consulta con el parmetro profiling=true o profiling=yes en la URL de la aplicacin.

    http://localhost:8080/ejemplo02/ConfirmarAgregar_Cliente.accion?profiling=yes

    Para detener la creacin de perfiles de una aplicacin, basta con pasar del

    parmetro profiling=no oprofiling=false http://localhost:8080/ejemplo02/ConfirmarAgregar_Cliente.accion?

    profiling=no

    2) Activar el mtodo UtilTimerStack.setActive(true) en la funcin que se va a perfilar.

    3) Activar la constante del sistema UtilTimerStack.ACTIVATE_PROPERTY.

    Para activar la creacin de perfiles de una aplicacin de Struts, sta debe estar configuradaen modo de desarrollo struts.devMode=true. La creacin de perfiles nicamente puede

  • INFO: [500ms] - Handling request from Dispatcher [0ms] - create DefaultActionProxy: [0ms] - actionCreate: ConfirmarAgregar_Cliente [453ms] - invoke: [453ms] - interceptor: exception [453ms] - invoke: [453ms] - interceptor: alias [453ms] - invoke: [453ms] - interceptor: servletConfig [453ms] - invoke: [453ms] - interceptor: i18n [453ms] - invoke: [453ms] - interceptor: prepare [453ms] - invoke: [453ms] - interceptor: staticParams [453ms] - invoke: [453ms] - interceptor: actionMappingParams [453ms] - invoke: [453ms] - interceptor: params [453ms] - invoke: [453ms] - interceptor: conversionError [453ms] - invoke: [453ms] - interceptor: validation [125ms] - invoke: [125ms] - interceptor: workflow [125ms] - invoke: [0ms] - invokeAction: ConfirmarAgregar_Cliente [125ms] - executeResult: success

    Cdigo: ejemplo02.Cliente.javapackage ejemplo02;

    import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.util.profiling.UtilTimerStack;

    @SuppressWarnings("serial")public class Cliente extends ActionSupport { ... public String execute() { String activite="database access"; UtilTimerStack.push(activite); try { System.out.println("En el mtodo de laaccin y el acceso a la base de datos"); } catch(Exception e) { UtilTimerStack.pop(activite); } finally {

    mostrarse cuando se ha activado el seguimiento y no se ha prohibido por Log4J y su archivo depropiedades.

    A continuacin, se presenta un ejemplo de registro con la siguiente URL:

    http://localhost:8080/ejemplo02/ConfirmarAgregar_Cliente.accion?profiling=true

    Podemos igualmente crear perfiles de las actividades especficas con los mtodos push() y pop() de la

    clase esttica UtilTimerStack. El siguiente es un ejemplo para realizar el seguimiento nicamente de

    los accesos a una base de datos.

  • UtilTimerStack.pop(activite); } return "success"; }}

  • En resumen

    Este captulo ha explicado en primer lugar cmo gestionar los registros con el framework Struts. Struts

    utiliza un sistema de visualizacin muy detallado y debe configurarse correctamente en la fase de

    desarrollo. En un segundo punto, hemos presentado la etiqueta XHTML incorporada por

    defecto con la biblioteca de etiquetas de Struts. Por ltimo, el ltimo prrafo explica el funcionamiento

    de la creacin de perfiles en los desarrollos con la herramienta Struts.

  • Presentacin

    Struts utiliza un controlador principal para la administracin del enrutamiento y de los parmetros. As,

    podemos concentrarnos en la realizacin y la codificacin de las distintas acciones del proyecto. Cada

    accin de Struts est definida en el archivo de configuracin struts.xml (o en las clases con la tcnica

    de configuracin cero). Struts permite igualmente la utilizacin de expresiones regulares y las

    invocaciones dinmicas de mtodos.

  • Clases de accin

    La creacin de acciones es el trabajo ms importante de la fase de desarrollo que se debe realizar

    con la ayuda del framework Struts. Por ejemplo, tendremos acciones para mostrar la pgina de inicio,

    administrar los artculos, ocuparse de la autenticacin del cliente y otras. Algunas operaciones son

    simples y no requieren de ninguna clase, sino que realizan simplemente una redireccin, mientras que

    otras efectan procesamientos complejos asociados a una clase de accin.

    Una clase de accin es simplemente una clase Java. Por lo tanto, esta clase contiene atributos y

    mtodos. Sin embargo, es necesario respetar algunas reglas para tener una verdadera clase de

    accin.

    Cada atributo debe estar asociado a sus descriptores de acceso (getter y setter). Las reglas

    son las mismas que para los JavaBeans.

    Una clase de accin debe tener un constructor por defecto sin argumento. Sin embargo, si no

    creamos ningn constructor por defecto, Struts lo har por nosotros durante la compilacin.

    Tambin podemos utilizar otro constructor (por inicializacin), pero en este caso el constructor

    por defecto sigue siendo obligatorio.

    Una clase de accin debe tener al menos un mtodo para realizar la accin. Por defecto, este

    mtodo se llama execute(), pero puede llevar cualquier nombre asociado con la

    etiqueta y el atributo method presentes en el archivo de configuracin de la

    accin struts.xml.

    Una clase de accin puede estar asociado a varios mtodos. En este caso, la clase de accin

    gestionar, por ejemplo, la visualizacin de los clientes, el formulario de creacin, la

    confirmacin de la creacin, la consulta, la visualizacin del formulario de modificacin, la

    confirmacin de la modificacin y, por ltimo, la eliminacin.

    Una clase de accin no necesita heredar de una clase especfica o de una interfaz

    determinada. Sin embargo, es muy fcil y aconsejable heredar de la

    clase ActionSupportpresente en el paquete com.opensymphony.xwork2.action.

    La clase com.opensymphony.xwork2.actionSupport es la clase de accin predeterminada de Struts. El

    framework crea una instancia de esta clase si no se ha especificado ninguna declaracin. Si

    implementamos la clase ActionSupport, estarn disponibles las siguientes constantes:

    SUCCESS: esta constante indica que la ejecucin de la accin es correcta y que se debe

    mostrar la pgina de confirmacin adaptada.

    NONE: esta constante indica que la ejecucin de la accin es correcta,