SlideShare una empresa de Scribd logo
1 de 138
Aplicaciones Web con
Jakarta Struts
Javier Oliver Fulguera

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Tema 1: Introducción y arquitectura
l  Tabla de contenidos
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 

Introducción
Modelos arquitectónicos
Arquitectura MVC
El Controlador (Controller)
El Modelo (Model)
La Vista (View)
¿Qué es un Framework?
Framework Jakarta-Struts
Alternativas a Struts
Barracuda MVC
Cocoon
Expreso
Freemarker, Velocity y Web Macro
Maverick
Spring
Java Server Faces
Instalando Struts

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Introducción
l  El framework (marco de trabajo) open source Struts se creó para permitir
que los desarrolladores pudieran crear aplicaciones Web basadas en
componentes web desarrollados con tecnología Java (Servlets y Java
Server Pages). Al igual que ocurre con cualquier construcción, una
aplicación debe asentarse sobre unos pilares que permitan crecer al resto
de la estructura. La traducción al castellano de la palabra Strut define muy
bien el propósito del proyecto, ya que actuaría como un puntal (pilar) sobre
el que se soporta el peso del resto del desarrollo.
l  El framework fue creado por Craig R. McCIanahan y donado a la Apache
Fundation Software (ASF) en el año 2000, convirtiéndose poco después en
una referencia para los desarrolladores de aplicaciones web.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Modelos arquitectónicos
l  Modelo 2 -> Este modelo se apoya en el patrón de diseño Model-ViewController, utilizando JavaBeans-JSPs-ServIets. Los javabeans
representan al modelo de la aplicación, las páginas JSP a la vista, y los
servlets actúan como controladores.
l  MVC es tan común que se han desarrollado varias infraestructuras en torno
a este patrón de diseño, entre ellas Apache Struts y Java Server Faces

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Arquitectura MVC
l  El Controlador (Controller)
¡  En este modelo un servlet central recibe las peticiones del cliente, procesa la
URL recibida y delega el procesamiento de la lógica de la aplicación a los
distintos JavaBeans. Estos generan un resultado que el servlet guarda en el
contexto de la petición, la sesión o la aplicación. En un último paso, el servlet
transfiere el control a un JSP que lleva a cabo la presentación de los resultados.

l  El Modelo (Model)
¡  El modelo es el que maneja los datos y la funcionalidad de la aplicación. Los
JavaBeans (o EJBs para aplicaciones más escalables) desempeñan el rol de
modelo. En este papel, pueden ejecutar lógica de negocio o bien guardar datos.
¡  Normalmente, el servlet controlador invoca un método en el bean lógico y éste
devuelve un bean de datos al que tiene acceso el diseñador de la página JSP.

l  La Vista (View)
¡  Este papel es ejecutado por páginas JSPs. El servlet controlador transfiere el
control al JSP después de haber guardado en un contexto el resultado en forma
de un bean de datos. JSP usa las acciones jsp:useBean y jsp:getProperty
para recuperar datos y formatear la respuesta en HTML o XML.
Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Arquitectura MVC (II)

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
¿Qué es un Framework?
l  Es un conjunto de clases e interfaces que cooperan para solucionar un tipo
específico de problema software.
l  Tiene las siguientes características:
¡  Consta de múltiples clases o componentes, cada uno de los cuales
puede proporcionar una abstracción de algún concepto determinado.
¡  Define cómo estas abstracciones trabajan conjuntamente para solucionar
un problema.
¡  Sus componentes son reutilizables.
¡  Organiza patrones en un nivel superior.

l  Un framework, además, debería proporcionar un comportamiento común a
múltiples aplicaciones.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Framework Jakarta-Struts
l  Struts es una de estos frameworks basadas en MVC. Provee un conjunto de clases
y taglibs (librerías de etiquetas personalizadas) que conforman el controlador, la
integración con el modelo (o lógica de negocio) y facilitan la construcción de vistas.
l  Las aplicaciones basadas en Struts constan de:
¡  Código Java
¡  Descriptores de despliegue (deployment descriptors) que configuran el framework para el
uso de nuestra aplicación
¡  Struts nos proporciona una serie de elementos para la construcción de aplicaciones web:
l 
l 
l 
l 
l 
l 
l 
l 
l 
l 
l 

Javier Oliver Fulguera

Un servlet (ActionServIet) que actúa como controlador MVC totalmente configurable.
Clases base que son extendidas para implementar la lógica de la aplicación web:
org.apache.struts.action.Action
org.apache.struts.action.ActionForm
Un conjunto de etiquetas personalizadas JSP que cooperan con el controlador para su uso en la parte
de la vista de MVC
Distintas opciones para la validación de entrada de usuario en formularios HTML:
ActionForm
Validator Framework
Mecanismos para el tratamiento de errores
Soporte para la internacíonalización (i18n) a través de ficheros de recursos y Java Locales
Soporte para fuentes de datos

@javioliful

www.oliverfulguera.es
Framework Jakarta-Struts
l  Además el grupo Struts siempre da la bienvenida a nuevos participantes.
Para convertirse en colaborador, se recomienda formar parte primero de la
lista de distribución de Struts. Si te gusta lo que allí aparece puedes echar
un vistazo a la lista de Struts Developers. La página principal del proyecto
está ubicada en http://jakarta.apache.org/struts.

Javier Oliver Fulguera

@javioliful

Página del proyecto Apache.
www.oliverfulguera.es
Alternativas a Struts
l  Otros marcos de trabajo comparables a Struts pueden ser elegidos como
alternativas a éste. A continuación se citan algunos de los proyectos más
interesantes que han venido desarrollándose en los últimos tiempos:
l  Barracuda MVC
¡  El entorno de trabajo es un tipo de de arquitectura similar al Modelo 2 de Struts,
pero va más allá, proporcionando mecanismos de notificación basada en
eventos
al modelo. Además, proporciona vistas generadas en base a un motor de
plantilla,
y cuya formación se hace a través de XML (XMLC) y no exclusivamente JSP.
Podemos encontrar más documentación en
http://www.barracudamvc.org/Barracuda/docs/index.html.

l  Cocoon
¡  Stefano Mazzocchi fundó este proyecto en enero de 1999 como un proyecto de
código abierto bajo la ASF. El objetivo era separar el estilo de contenido , la
lógica y las funciones de gestión para los sitios Web basados en XML. Influye
por lo tanto en XML (XSLT,SAX) para ayudar a crear, desarrollar y mantener
aplicaciones de servidor XML. Más información podemos encontrarla en
http://cocoon.apache.org
Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Alternativas a Struts (II)
l  Expreso
¡  Expresso, de Jcorporate, es un marco de desarrollo de aplicación que proporciona un marco
de trabajo basado en componentes. Proporciona una serie de componentes principales
compatibles tanto con aflicciones EJB como no EJB. Aunque completamente independiente
de Struts y otros marcos, los componentes Expresso también se pueden integrar con Struts
con el fin de añadir posibilidades de segundad, mapeado de objeto-a-relacional, gestión de
trabajo en segundo plano, etc. Más información en http://www.jcorporate.com.

l  Freemarker, Velocity y Web Macro
¡  Estos tres productos se agrupan por que representan tipos similares de motores
de plantilla. Freemaker genera HTML dinámicamente utilizando datos
proporcionados por servlets y mediante su propio lenguaje de plantilla. Velocity es
otro proyecto Jakarta como Struts, pero va más allá de la generación de HTML ya
que puede generar SQL, PostScritp y XML desde plantillas. Velocity utiliza un
lenguaje de script ligero que separa la lógica de las páginas del aspecto. Más
información sobre estos marcos se puede encontrar en
http://freemaker.sourceforqe.net,
http://jakarta.apache.org/velocity y
http://www.webmacro.org.

l  Maverick
¡  Ofrece la posibilidad de mostrar vistas utilizando JSP, el lenguage de script de Velocity o
XSLT. Maverick es una arquitectura de tipo MVC paro proporciona un mecanismo de
plantilla de vistas. Para más información se puede consultar http://mav.sourceforqe.net.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Alternativas a Struts (III)
l  Spring
¡  Es un marco para aplicaciones J2EE relativamente nuevo desarrollado por Rod
Jonson. No solamente es un marco Web, sino que permite la posibilidad de estar
integrado con otros componentes de naturaleza dispar. Consultar
http://www.springframework.org.

l  Java Server Faces
¡  Proporciona un conjunto estándar de etiquetas JSP, controladores, gestión de
eventos, etc. Que no solamente permiten el desarrollo web, sino el de
aplicaciones de naturaleza Java tales como Java Swing. Incluido en los
estándares J2EE de Sun y cuya documentación podemos encontrarla en
http://java.sun.com/javaee/javaserverfaces.

l  Esta lista puede ser completada con SiteMesh, Jakarta Turbina,
WebWork, además de marcos desarrollados por otras tecnologías tales
como UIP (User Interface Process) de Microsoft cuyos objetivos son
compartidos por Struts aunque desarrollados para su utilización en modelo
de programación .NET.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Instalando Struts
l  Una aplicación de struts es una aplicación web, por lo que vamos a
necesitar un servidor web y un contenedor de componentes web para su
despliegue y ejecución.
l  Necesitamos instalar la cualquiera de las versiones de Apache Struts, lo
podemos hacer de la siguiente dirección:
l  http://struts.apache.org/download.cgi o http://archive.apache.org/dist/struts
l  En nuestro caso, descargaremos el fichero struts-1.2.7.zip.
l  En el directorio webapps de la distribución de Struts se pueden encontrar
varios ficheros .war muy útiles.
¡ 
¡ 
¡ 
¡ 

Javier Oliver Fulguera

struts-blank.war: Es la base para cualquier aplicación.
struts-documentation.war: Documentación del framework.
struts-examples.war: Aplicaciones de ejemplo.
Etc.

@javioliful

www.oliverfulguera.es
Tema 2: Primera aplicación
l  Tabla de contenidos
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 

Introducción
Control de flujo en Struts
Diagrama de clases
Primer programa
Petición http y Action
La clase Action
Las vistas
El uso de Forward
El archivo de configuración struts-config.xml
El descriptor de despliegue de la aplicación (web.xml)
La estructura de la aplicación
Despliegue y ejecución
Atención de la petición

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Introducción
l  En este capítulo vamos a desarrollar la típica aplicación de ejemplo al más
puro estilo "HelloWorld". Para ello hemos de disponer de las herramientas,
librerías ya comentadas en el capítulo anterior.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Control de flujo en Struts
l  Cuando programamos con servlet y JSP directamente, somos
responsables del flujo de navegación.
l  Para ello usamos RequestDispatcher u otros mecanismos que nos
reencaminen hacia los componentes que determinemos en base a la
información que el cliente nos proporciona en su petición http.
l  No obstante, si usamos un framework como Struts El desarrollador será
responsable de la lógica de negocio, de la vistas, etc.. pero no del control
del flujo ni otros aspectos que se suponen comunes para este tipo de
aplicaciones; validación, intemacionalización, etc.
l  Este control se definirá de forma declarativa usando archivos xml. De
esta forma damos flexibilidad a nuestras aplicaciones, pudiendo reutilizar el
sistema de control de flujo en cada uno de los sistemas que estemos
construyendo.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Control de flujo en Struts (II)
l  A continuación se citan los componentes que están implicados en una
aplicación web en lo que al control de flujo y tratamiento de las peticiones
se refiere:
¡  La clase org.apache.struts.action.ActionServIet es el eje de Struts. Dada una
petición de entrada HTTP:
1.  Crea un objeto ActionForm donde guarda y valida los parámetros de entrada
2.  Decide qué objeto Action se debe invocar y le pasa el objeto ActionForm creado
3.  Transfiere el control a la siguiente etapa de procesamiento de la petición (típicamente
un JSP).

l  El fichero de configuración web.xml contiene los url mappings para enviar las
peticiones de llegada al ActionServIet, mientras que el fichero de configuración
de Struts struts-config.xml contiene los mappings a acciones

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Control de flujo en Struts (III)
l  Los formbeans creados por ActionServIet deben ser implementados por el
programador, extendiendo org.apache.struts.action.ActionForm.
¡  El programador deberá definir un conjunto de getters y setter y sobreescribir
los métodos validate() y reset()

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

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Diagrama de clases
l  Diagrama:

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Primer programa
l  Vamos a crear el primer ejemplo con struts. Esta aplicación no tiene
entrada, y el resultado de salida es el típico "Hola Mundo" de todos los
lenguajes de programación.
l  Copiar las siguientes librerías en la carpeta lib de WEB-INF:
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 

antlr.jar
commons-beanutils.jar
commons-digester.jar
commons-fileupload.jar
commons-logging.jar
commons-validator.jar
jakarta-oro.jar
struts.jar

l  Estas librerías se encuentran en la carpeta lib del directorio de instalación
de struts.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Petición http y Action
l  Las acciones responden a peticiones http (request). Cuando escribimos un
Action hemos de extender de la clase org.apache.struts.action.Action y
sobreescribir su método execute. Este método servirá para el tratamiento
de la petición.
l  El método execute devuelve un ActionForward. Podemos pensar en un
ActionForward como en una vista de salida, o lo que es lo mismo,
dependiendo el ActionForward que hayamos obtenido, se reencaminará el
flujo hacia una vista u otra.
l  El método execute recibe cuatro argumentos:
¡ 
¡ 
¡ 
¡ 

un ActionMapping
un ActionForm
un HttpServIetRequest
un HttpServIetResponse

l  El ActionMapping es el objeto en el que se manifiesta el elemento XML
usado para configurar el Action en el fichero de configuración de struts. El
ActionMapping contiene un grupo de ActionsForwards asociados con la
acción actual.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
La clase Action
l  Siguiendo lo expuesto con anterioridad.La clase Action será la que se corresponda
con el caso de uso que se está desarrollando.

Esta clase Action nos lleva hacia una vista de salida llamada bien, o hacia una vista de salida
llamada error, dependiendo del valor de un parámetro de la petición. Estas vistas de salida,
ActionForward, serán páginas JSP (hola.jsp y error.jsp)
Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Las vistas
l  La página de error y la de bienvenida, son similares. Utilizarán de forma
muy básica los recursos que la tecnología JSP nos proporciona. Sin entrar
en detalles que más adelante comentaremos, tales como desacoplamiento
de mensajes, internacionalización, validación, etc.
error.jsp

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Las vistas (II)
hola.jsp

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
El uso de Forward
l  Un forward es una vista de salida, como hemos dicho.
l  Pero lo único que hemos puesto como argumento en el método
findForward de la clase ActionForward, ha sido un nombre lógico, no una
dirección, esto nos permitirá mayor desacoplamiento entre las distintas
partes de la arquitectura, pero debemos proporcionar una forma de
relacionar este nombre lógico con una URL que nos dirija hacia el forward
de salida.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
El archivo de configuración strutsconfíg.xml
l  Para ligar los nombres lógicos de la redirección anteriormente establecida y
las vistas asociadas a los mismos debemos actuar en el archivo de
configuración de struts.
l  El fichero de configuración de struts se llama struts-confíg.xml.
l  Esta correspondencia entre el nombre lógico del forward, y la url de la
página jsp de salida, se establece en el elemento action-mappings. Este
elemento contiene los elementos action.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
El archivo de configuración strutsconfíg.xml (II)
l  En el caso del ejemplo, este fichero de configuración es como se muestra a
continuación:
l  struts-confíg.xml

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
El archivo de configuración strutsconfíg.xml (III)
l  El elemento action tiene dos atributos:
¡  path
¡  type

url lógica que representa a la acción
nombre totalmente cualificado de la clase Action

l  El elemento action contiene los elementos forward. Mediante los atributos
name y path de este elemento, se asocia el nombre lógico del forward con
la url de la página jsp.
l  La ubicación de este fichero de configuración de struts, struts-config.xml,
se especifica como parámetro de incicialización del ActionServIet de struts,
dentro del archivo web.xml de la aplicación web.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
El descriptor de despliegue de la
aplicación (web.xml)
l  En el caso del ejemplo, el archivo web.xml es como se muestra a
continuación:

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
El descriptor de despliegue de la
aplicación (web.xml) (II)

l  En este archivo de configuración web.xml se indica que todas las url de
extensión .do sean procesadas por el ActionServIet de struts. Este
ActionServIet lee el fichero de configuración struts-config.xml donde se han
asociado previamente los nombres lógicos de los forward con las url de las
páginas jsp de salida.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
La estructura de la aplicación
l  La estructura de nuestra primera aplicación web deberá corresponder a la
estructura que J2EE especifica para los módulos web. En nuestro caso
será la siguiente:

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Despliegue y ejecución
l  Para ejecutar la aplicación, debemos asegurarnos de tener arrancado el
servidor y usando un navegador web, realizar la petición sin olvidar el
sufijo .do y acorde a como la hayamos definido en el struts-config.xml.
Además, pasaremos el parámetro de la petición en la misma barra de
direcciones.
l  El resultado en ejecución se muestra a continuación:

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Despliegue y ejecución (II)
l  Si omitimos el argumento, el resultado cambia:

Dependiendo del valor del parámetro se muestra una vista u otra.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Atención de la petición
l  El siguiente diagrama no da perfecta idea del comportamiento que tiene una
aplicación struts cuando atiende una perición http de forma genérica.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Tema 3: Integración con la capa de datos
l  Tabla de contenidos
¡ 
¡ 
¡ 
¡ 

Usando JDBC con Struts DataSources
Configuración del DataSource
Implementación del nuevo caso de Uso
El objeto de negocio y el DAO

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Usando JDBC con Struts DataSources
l  El uso de Struts DataSources, fuentes de datos de struts, nos permite
obtener los beneficios de los datasources sin depender de ninguna
implementación propietaria. Por una parte, esto hace que nuestra
aplicación sea más portable y por otro, no estamos obligados a usar alguna
de las características más avanzadas de la implementación particular, si es
que no fuera necesario.
l  Para trabajar con struts datasources vamos a necesitar dos nuevas
librerías .jar:
¡  commons-pooling.jar
¡  commons-dbcp.jar

l  Estas librerías no vienen con la instalación de struts, así que tenemos que
descargarlas de la siguiente dirección de internet:
l  http://jakarta.apache.org/site/downloads/downloads commons-pool.cgi
l  http://jakarta.apache.org/site/downloads/downloads commons-dbcp.cgi

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Configuración del DataSource
l  Lo primero que tenemos que hacer es configurar el datasource dentro del
archivo de configuración de struts (struts-config.xml). Para ello existe el
elemento data-sources, que contiene tantos data-source como fueran
necesarios en nuestra aplicación. En el caso de nuestro ejemplo, la
configuración del datasource queda como se muestra a continuación:
l 

Fragmento struts-config.xml

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Configuración del DataSource (II)
l  El datasource se marca con una clave, que es el atributo key, que servirá,
dentro de la clase Action que lo maneje, para obtener el objeto en caso de
que haya más de un DataSource declarado. Mediante el uso de las
distintas propiedades se establece nombre de la clase del driver, la URL de
conexión, las características del pool de conexiones que maneja el
contenedor, etc..

Javier Oliver Fulguera

@javioliful
Configuración del DataSource (III)
l  El código de la clase Action que maneja el DataSource es el que se
muestra a continuación: consultarTodos.java
l 

Javier Oliver Fulguera

@javioliful
Implementación del nuevo caso de Uso
l  Para poder dotar a nuestra aplicación del nuevo caso de uso (el catálogo
de artículos) debemos hacer las siguientes modificaciones en nuestra
aplicación:
1.  Añadir la declaración del DataSource en struts-config.xml. Este paso ya ha
sido expuesto anteriormente
2.  Añadir la nueva acción "verArticulos", junto a la clase Action que
lo implementa así como su vista asociada "verTodos.jsp".

3.  Recorrer en la vista la colección de Artículos. La página verTodos.jsp, es parte
de la vista, no es motivo de estudio en este ejemplo. No obstante adelantamos
que el cometido de la misma es recuperar de la petición (request) una colección
de "Transfer Objects" y llevar a cabo su recorrido para mostrarla de forma
atractiva al usuario.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Implementación del nuevo caso de Uso
l  verTodos.jsp

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
El objeto de negocio y el DAO
l  Articulo.java

Javier Oliver Fulguera

@javioliful
El objeto de negocio y el DAO (II)
l  ArticuloDAO.java

Javier Oliver Fulguera

@javioliful
El objeto de negocio y el DAO
Obtener la conexión del Contexto
l  Si queremos conseguir el origen
de datos del contexto de la aplicación
deberemos registrarlo en el archivo
del Tomcat: conf/Context.xml

l  Y posteriormente obtenerlo
por JNDI en el ADO
o donde queramos)

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Tema 4: Manejo de formularios
l  Tabla de contenidos
¡  Introducción
l 
l 
l 
l 
l 
l 
l 

Form Beans
Definición de un Form Bean
Ejemplo de un Form Bean
Configuración del Form Bean
Lógica de negocio (Action)
Mostrando la información obtenida
Ejecución de la aplicación

¡  Validación de formularios

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Introducción
l  En este capítulo mostraremos la forma de interactuar por parte de los
usuarios con nuestra aplicación struts mediante el uso de formularios y de
los distintos tipos de componentes ActionForm que se generan en cada
llamada.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Form Beans

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Form Beans
l  Un ActionForm es un JavaBean con propiedades que corresponden a los
controles de un formulario HTML.
l  Los parámetros son mapeados a propiedades del bean.
l  Estos componentes proveen un mecanismo de validación que es necesario
para asegurarnos que el usuario introduce los datos esperados. En
definitiva, actúan como puente entre el navegador y lo objetos de negocio.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Definición de un Form Bean
l  El programador define un form bean extendiendo la clase
org.apache.struts.action.ActionForm. También puede definirse de forma
declarativa usando usando org.apache.struts.action.DynaActionForm.
Además, deben tener las siguientes características:
¡  Hay que definir cada una de las propiedades en la clase y escribir los getters/
setters correspondientes, siguiendo las reglas de la convención de nombres de
los 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

l  Cada vez que se llama a la acción , el ActionServIet rellenará las
propiedades con los valores de los parámetros recibidos en el formulario
HTML que deberá ser definido usando etiquetas de la librería de Struts.
l  Nota: Las propiedades no sólo pueden ser escalares sino que también
pueden ser colecciones de valores.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Ejemplo de un Form Bean
l  Supongamos que deseamos consultar un artículo de nuestro catálogo.
Para ello proporcionaremos un formulario en nuestra página de entrada de
datos que llamaremos verUnoInput.jsp, y cuyo fragmento de código se
muestra a continuación en lo que al formulario se refiere.
l  verUnoInput.jsp (código)

l  verUnoInput.jsp (en navegador)

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Ejemplo de un Form Bean (II)
l  Necesitaremos un Form Bean que ecapsule la información de la cajita de
texto ("id") que usuario rellenará con el valor de la clave primaria del
articulo que se está buscando, esta propiedad deberá hacerse
corresponder con la propiedad "id" el Form Bean (Action Form).
l  Veamos el código de VerUnoForm.java.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Ejemplo de un Form Bean (III)

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Configuración del Form Bean
l  Al igual que el resto de componentes, hemos de dar de alta en el fichero de
configuración de struts el componente, dándole un nombre para poder
asociarlo con una acción.
l  En fichero hemos de indicar además la clase que implementa el form. En
nuestro ejemplo, la clase es app.view.VerUnoForm y le hemos dado el
nombre verUnoForm.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Fragmento de struts-config.xml

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Lógica de negocio (Action)
l  Por supuesto todo esto no vale para nada si detrás no hay el
correspondiente Action que obtiene la información del bean e invoca a la
lógica de negocio.
l  Es importante observar el modo de hacer el casting hacia el tipo de Form
Bean adecuado y que previamente hemos definido unas líneas más arriba.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Lógica de negocio (Action) (II)

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Mostrando la información obtenida
l  Tal y como expusimos en el capítulo anterior durante el desarrollo del caso
de uso verTodos, mostramos a continuación el fragmento de código que
permitirá recuperar del request un objeto y acceder a sus propiedades.
Para ello utilizaremos etiquetas personalizadas logic
l  verUno.jsp

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Ejecución de la aplicación
l  Si introducimos un indentificador acorde a la validación que hemos hecho
en el Action Form obtendremos el resultado esperado.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Ejecución de la aplicación (II)

! Si por el contrario dejamos el campo de texto en blanco,
volveremos a la pagina verUnoInput.jsp

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Tema 5: Validación de formularios
l  Tabla de contenidos
¡  Validación de formularios
l  Framework Validator

¡  Introducción
l  Uso del Framework Validator
l  Respecto al Action

¡ 
¡ 
¡ 
¡ 

Ejecución de la aplicación
Reglas de validación comunes
Validación en el lado del cliente con JavaScript
Uso y Validación de DynaActionForms
l  Validación de un DynaActionForm
l  Lectura de propiedades de un DynaActionForm

¡  Validación del lado del cliente

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Validación de formularios
l  Como hemos visto, es de vital importancia por muchos motivos la correcta
introducción de los datos por parte del usuario. Aquellos datos que el
cliente no introduzca correctamente, formato, longitud, etc.. no deberían
viajar al servidor por lo que una capa de verificación (validación de datos)
por JavaScript del lado el cliente puede ser interesante. Proponemos una
solución para realizar una validación básica que permita obtener con el
mínimo esfuerzo esta capa software. Se trata del Framework Validator

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Framework Validator
l  Introducción
l  El Framework Validator se utiliza para validar campos. La validación de
un campo determinado se puede realizar en múltiples formularios. Por
ejemplo, el código postal de un usuario se debe validar en el formulario de
registro y también en un formulario de pedido. Podemos escribir dicha
validación en el método valídate de cada uno de los ActionForm,
duplicando el código, o podemos crear un mecanismo general de validación
para todos los códigos postales que manejemos en nuestra aplicación.
l  Existen muchas reglas de validación que podemos usar y además,
tenemos la posibilidad de crear nuestras propias reglas en caso de que
fuera necesario.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso del Framework Validator
l  Para introducirnos en la utilización de este framework, vamos a seguir de
nuevo, paso a paso el ejemplo que estamos desarrollando a lo largo del
manual. Vamos a validar el nombre de usuario del formulario de registro.
Las reglas que establecemos para darlo por válido son:
¡  Que tenga un mínimo de 3 caracteres
¡  Que tenga un máximo de 8 caracteres

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso del Framework Validator
l  Hemos de seguir los siguientes pasos:
l  1. Lo primero que tenemos que hacer es añadir el plug-in Validator en el
fichero de configuración de struts. El framework Validator se integra con
struts a través de este plug-in, el cual es responsable de leer los ficheros de
configuración para las reglas de validación. El elemento plug-in debe
incorporarse al fichero de configuración de struts después de cualquier
elemento message-resources. En el caso de nuestro ejemplo, el fichero de
configuración struts-config.xml se completa como se muestra a
continuación:
l  Struts-config.xml

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso del Framework Validator
l  2. Hemos de copiar los archivos validator-rules.xml y validation.xml
dentro de la carpeta WEB-INF de nuestra aplicación. Estos archivos se
encuentran en la aplicación de ejemplo que viene con la instalación de
struts (struts-blank.war).
l  Por el momento no vamos a modificar el archivo validator-rules.xml, ya
que vamos a utilizar las reglas de validación que nos proporciona struts.
l  El archivo validation.xml nos proporciona el mapeo entre la propiedad del
ActionForm, las reglas de validación que se le aplican y el mensaje de error
correspondiente.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso del Framework Validator
l  3. Hemos de cambiar la clase ActionForm con la que trabajamos
(RegistrarUsuarioForm.java) para que extienda de
org.apache.struts.validator.ValidatorForm. Esta clase es el nexo de
unión entre Struts y el framework Validator.
l  La clase ValidatorForm sobrescribe el método validate() y le comunica al
framework Validator que aplique las reglas de validación a los campos de
este formulario.
l  Así que modificamos el código del formulario para que quede de la
siguiente manera:

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso del Framework Validator
l  VerUnoValidatorForm.java

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso del Framework Validator
l  Añadimos el formulario dentro del archivo validation.xml, del siguiente modo:
l  Validation.xml

l  Un detalle importante. Como valor del atributo name para el form, se ha puesto
el mismo nombre que lo asociaba a su action en el archivo struts-config.xml
l  struts-config.xml

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso del Framework Validator
l  4. Añadimos un elemento field a la declaración del formulario en el archivo
validation.xml correspondiente al campo usuario. Después le asociamos las
distintas reglas de validación que le queremos aplicar:

l  El atributo depends toma como valor la lista de reglas aplicables al campo,
separadas por comas. En este caso se asocian las reglas required, minlength y
maxlength. Estas reglas se encuentran definidas dentro del archivo validatorrules.xml y forman parte del framework Validator. Por ejemplo, si miramos la regla
para minlength en el archivo validator-rules.xml, vemos lo siguiente:
Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso del Framework Validator
l  validator-rules.xml

l  En esta definición se asocia el nombre de la regla con la clase utilizada para la
validación y que implementa la regla, y la clave para el mensaje que el framework
debe mostrar en caso que se produzca un error en la validación. Esta clave debe
asociarse al mensaje dentro del archivo de recursos de la aplicación.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso del Framework Validator
l  5. Añadimos los mensajes de error con sus claves dentro del archivo de
recursos de la aplicación. Podemos tomar como ejemplo los
proporcionados por el archivo validator-rules.xml de la aplicación de
ejemplo de struts:
l  MessageResources.properties

Javier Oliver Fulguera

@javioliful
Uso del Framework Validator
l  Este fichero debe ser alojado en la aplicación y declarado en strutsconfig.xml. Contendrá a modo de pares clave, valor los mensajes que se
deberán ir mostrando en cualquiera de los aspectos de la aplicación;
errores, mensajes de advertencia, títulos, etc.
l  La declaración en el struts-config.xml se hará de la siguiente forma.
l  struts-config.xml

l  La ubicación y su localización tendrá la misma forma que las clases
Java, por lo que en el caso de nuestro ejemplo,
"app.view.ApplicationResources" nos indicará que el fichero está en el
directorio
.../WEB-INF/classes/app/view.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso del Framework Validator
l  Podemos adaptar nuestro archivo de recursos y adaptarlos a nuestras
necesidades, incluyendo literales, variables etc.
l  Fragmento de nuestro ApplicationResources.properties

l  Observa que los mensajes de error toman un argumento en el caso de la
regla required y dos en las otras dos reglas. Hemos de configurar estos
argumentos.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso del Framework Validator
l  6. El primer argumento del que se habla en el punto anterior, va a indicar
la etiqueta del campo validado, y el segundo el número de caracteres que
se permiten como máximo y mínimo respectivamente. Esto se ha de
configurar en el archivo validation.xml:

l  Se incluye un elemento <var> por cada parámetro que se evalúa
Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso del Framework Validator
l  Observamos de nuevo el mensaje error asociado a la clave de longitud
mínima:

l  El argumento {0} lo leemos del archivo de recursos de nuestra aplicación.
Es decir, en <arg0 key="verUno.id"/> observamos la clave "verUno.id", así
{0} será el literal asociado a dicha clave en
ApplicationResources.properties, pero el segundo corresponde al valor que
hemos asociado a la variable minlength. Es decir, este dato no lo
obtenemos del archivo de recursos, sino de la propia variable definida en el
archivo validation.xml mediante el par de entradas <var-name>/<var-value>
y asociada al argumento <arg1>. En definitiva, y resumiendo: {0}, {1}, {2} se
sustituirá por <arg0>, <arg1> y <arg2>.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Respecto al Action
l  Recordemos que el Action (verUnoAction), es decir, el objeto que ecapsula
las llamadas a la lógica de negocio, usaba la clase verUnoForm para
obtener la información del exterior ("id"). Ahora hemos alterado esta
situación, ya que usamos verUnoValidatorForm y por tanto habrá que
hacer modificaciones en la clase, ya que el casting debe ir hacia esta clase
y no la anterior. Es muy común, por otra parte, olvidar este pequeño detalle,
dando lugar a errores de incómoda búsqueda.
l  En este ejemplo nos crearemos un Actión nuevo para hacer la prueba.
l  Fragmento de VerUnoActionValidator.java

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Respecto al Action
l  Tambíen nos crearemos un jsp nuevo para la prueba, pues tendrá que
llamar nuevo Action.
l  Fragmento de verUnoInputValidator.jsp

l  Configuración definitiva en del action en el struts-config.xml
l  struts-config.xml

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Ejecución de la aplicación
l  Si ejecutamos la aplicación ahora, y no cumplimos con los requisitos del
campo, struts nos redireccionará el flujo de la aplicación de nuevo al input,
en nuestro caso verUnoInputValidator.jsp.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Reglas de validación comunes
l  En la siguiente tabla se recogen las reglas de validación que incluye el
framework Validator

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Validación en el lado del cliente con
JavaScript
l  Es bastante común realizar una validación en el lado del cliente con
javascript. Esto evita que los datos viajen al servidor mientras no cumplan
las condiciones de validación. El framework Validator tiene un mecanismo
para generar código JavaScript. Para utilizar javascript tenemos que hacer
lo siguiente:
l  1. Añadimos una etiqueta html:javascript a la página jsp, del siguiente
modo:

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Validación en el lado del cliente con
JavaScript
l  2. Para validar el formulario en el lado del cliente tenemos que añadir a la
etiqueta html:form el atributo onsubmit, del siguiente modo:

l  Importante: El nombre del método valídate, se forma acompañando al
valor del atributo formName anterior, empezando con mayúscula.
l  Si el valor de retorno es false, los datos no se envían al servidor.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Validación en el lado del cliente con
JavaScript
l  Si hacemos los cambios mencionados, y accedemos a la página jsp de alta
de usuario, podemos ver el código javascript generado:

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso y Validación de DynaActionForms
l  Una de las primeras críticas que recibieron las primeras versiones de
Struts, fue que se consideraba que era tedioso tener que crear una clase
ActionForm por cada formulario (clase sencilla pero que suponía tener
los correspondientes get() y set() de cada dato).
l  Esto además suscita un problema en la teórica separación de roles, ya
que tanto los diseñadores de JSP como los programadores de los Actions,
debían ponerse de acuerdo en los campos de los formularios, pues si no se
producirán.
l  Los desarrolladores demandaron alguna forma más ágil y dinámica de
declarar estos componentes por lo que desde la versión 1.1 de Struts se
cuenta con los DynaActionsForms.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso y Validación de DynaActionForms
l  Estos ActionForms deberán ser declarados en el fichero strutsconfig.xml, de manera que quedarán a modo de entradas xml la
definición de los campos y los tipos de datos de cada ActionForm.
l  La diferencia con los ActionForms tradicional reside en que se añaden las
etiquetas "<form-property>" para definir cada uno de los campos. Para
cada campo hay que declarar su nombre ("name"), el tipo de dato ("type")
y, opcionalmente, un valor inicial ("inicial").

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso y Validación de DynaActionForms
l  Los tipos de datos aceptados por los ActionForm de tipo DynaActionForm
son:
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 

BigDecimal
Biglnteger
Boolean
Byte
Character
Double
Float
Integer
Short
Long
String
Date
Time
Timestamp
Tipo primitivos (int, char, long....)

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso y Validación de DynaActionForms
l  Configuración de DynaActionForm en el Struts-config.xml
l  Definición del form-bean:
Podemos observar en la propiedad id
declarada en la etiqueta <form-property
name="id“ type="java.lang.string"/>, que
recordemos que es la usada para
obtener los Articulo en cuestión.

l  Definición del Action:

Los únicos cambios que se dan en el struts-config.xml. El caso de uso relacionado con la
acción verUno se verá afectado ya que usaremos ahora verUnoDynaActionForm,
declarado en la etiqueta <action path="/verUno"
input="/verUnoInput.jsp" name="verUnoDynaActionForm">.
Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Validación de un DynaActionForm
l  La validación en un DynaActionForm no requiere grandes cambios, tan solo
modificaciones en el archivo validation.xml. Las reglas de validación,
seguirán siendo las mismas y por lo tanto el framework validator sequirá
actuando de la misma forma:
l  Fragmento afectado del validation.xml:

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Lectura de propiedades de un
DynaActionForm
l  Como hemos visto en el tratamiento de las peticiones, es la case Action la
encargada de tratar la peticiones y, por lo tanto, de extraer los parámetros
del Java Bean (ActionForm) correspondiente. La extracción de las
propiedades del un ActionForm tradicional (con o sin validación) se basaba
en la llamada al método getXyz(), siendo Xyz la propiedad en cuestión.
l  Usando DynaActionForms, no hay tales métodos getXyz() ni set Xyz(), ya
que las propiedades se generarán de forma dinámica y no hay una clase de
respaldo que modele las mismas. La forma de extraer la información será a
partir del método get("xyz") disponible en la clase
org.apache.struts.action.DynaActionForm. Veamos la porción de código
afectada.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Lectura de propiedades de un
DynaActionForm
l  Fragmento de Action afectado:

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Validación del lado del cliente.
l  Ya hemos justificado la necesidad de validar los datos de entrada en el lado
del cliente usando rutinas JavaScript. Es evidente que el uso de
DynaActionForm no condiciona el mecanismo general de validación, no
obstante hay que tener en cuenta los cambios a realizar en las páginas JSP
para evitar sorpresas en tiempo de ejecución. Vemos a continuación el
código de verUnoInput.jsp.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Validación del lado del cliente.
l  verUnoInput.jsp (modificaciones)

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Tema 6: Tratamiento de excepciones
l  Tabla de contenidos
¡  Excepciones con struts
¡  Tratando excepciones globales

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Excepciones con struts
l  En todos los programas se producen errores. Nuestro trabajo como
programadores es evitar que el usuario final se encuentre con un
resultado desagradable si esto sucede. Lo más probable es que no
queramos que el usuario de nuestro sitio web vea un stack trace de error
que posiblemente no entienda.
l  En el caso del ejemplo que nos ocupa, si tratamos de consultar un Articulo
que no existe en nuestro catálogo, la aplicación retornará una
DAOException, provocada por ArticuloDAO. En definitiva una excepción de
Usuario. Trabajando con struts podemos definir un manipulador de
excepciones (exception handler) para manejar la excepción. Un
exception handler nos permite manipular una excepción de manera
declarativa en el archivo de configuración struts-config.xml asociando una
excepción a un mensaje comprensible por el usuario dentro de una página
jsp que será mostrada al usuario si la excepción ocurre.
l  Vamos a seguir los siguientes pasos:

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Excepciones con struts
l  1. Creamos una página jsp llamada registroException.jsp en la raíz de
nuestra aplicación. En ella incorporamos la etiqueta html:errors para
mostrar el mensaje asociado con la excepción:
l  registroException.jsp

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Excepciones con struts
l  2. Añadimos una entrada en el archivo de recursos de la aplicación,
ApplicationResources.properties bajo la clave errors.verUno.exception,
que explique la naturaleza del problema en términos que el usuario
final pueda entender fácilmente. Por ejemplo:
l  ApplicationResources.properties

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Excepciones con struts
l  3. Añadimos un exception handler en el action mapping para /verUno
que maneje la excepción app.modelo.DAOException del siguiente modo:
l  Struts-config.xml

l  Observa que el elemento exception tiene tres atributos:
¡  key.- asocia el exception handler con una entrada del archivo de recursos.
¡  type.- Asocia el exception handler con el tipo de la excepción a tratar.
¡  path.- asocia el exception handler con la página jsp que se muestra si la
excepción ocurre.
Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Excepciones con struts
l  El resultado en ejecución:

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Tratando excepciones globales
l  Al igual que se pueden tener forwards globales, independientes de
cualquier acción, también podemos definir un tratamiento global a las
excepciones, es decir, independientemente de la acción que las provoque.

l  Una acción particular puede establecer el tratamiento de una excepción
que haya sido definida como global exception. El caso particular predomina
sobre el general.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Tratando excepciones globales
l  Para definir un tratamiento global de las excepciones, seguimos los
siguientes pasos:
l  1. Definimos una entrada para la excepción en el archivo de
recursos de la aplicación:
l  ApplicationResources.properties

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Tratando excepciones globales
l  2. Dentro del archivo de despliegue de la aplicación, struts-config.xml,
definimos un elemento gobal-exceptions, que contiene tantos elementos
exception como excepciones queramos tratar.
l  struts-config.xml

l  El elemento exception tiene tres atributos:
¡  key.- Corresponde a la entrada dentro del archivo de recursos de
la aplicación.
¡  type.- Tipo de excepción tratada.
¡  handler.- Nombre totalmente cualificado de la clase que trata el evento. Esta
clase debe extender de org.apache.struts.action.ExceptionHandler.
Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Tratando excepciones globales
l  Escribimos la clase que extiende de ExceptionHandler. En el caso del
ejemplo, el código es el que se muestra a continuación:
l  GestorProblema.java

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Tratando excepciones globales
l  Esta clase tiene un método execute que, entre otros, recibe como
argumento un objeto de la clase Exception. Dentro del método execute se
codifica la respuesta a la excepción. En este caso se imprime la traza
de la excepción en la salida estándar del servidor de aplicaciones, y se
dirige al usuario hacia la vista de salida marcada con el nombre
problemaGenerico.
l  Este forward se incluye en el archivo descriptor de despligue strutconfig.xml dentro del elemento global-forwards

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Tratando excepciones globales
l  Si se produce el error, se muestra al usuario la página html de error. En
el caso de nuestro ejemplo, si se produce un error inesperado se muestra
al usuario la siguiente vista de salida:

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Tema 7: Internacionalización
l  Tabla de contenidos
¡ 
¡ 
¡ 
¡ 

Internacionalización (I18N)
Configuración de nuestro navegador
Mostrando mensajes variables
La etiqueta <bean:message>

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Internacionalización (I18N)
l  Trabajando con struts podemos hacer, de forma sencilla, que nuestra
aplicación se presente ante el usuario en el idioma que tenga configurado
como preferido en su navegador. O bien mostrarla en el que el usuario elija
de los distintos propuestos en una página de inicio.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Configuración de nuestro navegador
l  Cada región (geográfica, política o social) se identifica mediante un estándar
formado por dos letras minúsculas. Podemos ver las distintas combinaciones en
el cuadro de configuración del idioma de nuestro navegador:

Para el idioma inglés, por
ejemplo, existen distintas
combinaciones de letras,
según la región, así como
para otros idiomas como el
español o el francés.

Javier Oliver Fulguera

@javioliful
Elegir el idioma
l  Vamos a hacer que nuestra aplicación se muestre en inglés o en español,
según el idioma preferido del usuario. Pero también podemos inventarnos
nuevos idiomas usando sufijos a nuestra conveniencia. Seguimos los
siguientes pasos:
l  1. Dentro del archivo struts-config.xml, añadimos la siguiente acción:

l  En el action podremos modificar de forma programática el idioma y no sólo
para idiomas predefinidos sino que podremos mostrar nuestros propios
dialectos. En nuestro caso pasaremos la cadena del dialecto escogido
usando parámetros de un formulario o directamente en la url. .../
cambiarIdioma?lenguaje=xx, donde xx puede ser un idioma inventado o
bien cualquiera que los estándares definen.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Elegir el idioma
l  CambiarldiomaAction. java

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Elegir el idioma
l  2. Para que las etiquetas del formulario se muestren en un idioma
determinado, hemos de incorporar tantos archivos de recursos como
idiomas se contemplen. Estos archivos deben contener en su nombre la
representación estándar del idioma. En nuestro caso teníamos el archivo
de recursos ApplicationResources.properties y ahora hemos de
incorporan uno nuevo, ApplicationResources_xx.properties. Dentro de
este archivo, y asociados a las mismas claves que el primero, se
encuentran los mensajes en el idioma xx:
l  Fragmento de ApplicationResources_en.properties

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Elegir el idioma
l  Podemos crear cuantos archivos paralelos deseemos, cuyos sufijos
nos indicarán el idioma en que queremos trabajar.
¡ 
¡ 
¡ 
¡ 

ApplicationResources_en.properties
ApplicationResources_en_GB.properties
ApplicationResources_es.properties
ApplicationResources_xx.properties

l  Si disponemos de estos archivos en nuestra aplicación, no será necesario
definir ningún idioma al arrancar la misma, a no ser que queramos alterarlo
de forma manual usando la acción cambiarIdioma.do, ya que el navegador
tendrá definido un idioma por defecto y en cada petición será
detectado y tratado de forma automática por struts. Enviando los
mensajes según corresponda.
l  Si configuramos el navegador en un idioma no contemplado por la
aplicación, ésta se mostrará en el idioma por defecto, es decir, mostrando
las etiquetas del archivo ApplicationResources.properties.
Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Mostrando mensajes variables
l  Más allá de los mensajes de error y otros, podemos mostrar texto plano o
con formato, desacoplado de la presentación en cuanto al idioma se refiere.
Para ello debemos usar las etiquetas personalizadas.
¡  La etiqueta <bean:message>

l  Permite mostrar mensajes desde el archivo de recursos de la aplicación. El
mensaje será el asociado a la clave, indicada en el atributo key.
l  ApplicationResources.properties

l  Cualquier JSP

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Resultado de la ejecución

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Tema 8: Composición de vistas
l  Tabla de contenidos
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 

Introducción
Plantillas con Struts
Composición de vistas con Struts Tiles
Layout
Vista JSP
Resultado de la ejecución

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Introducción
l  Un problema común a la hora de mantener un sitio Web suele consiste en
la dificultad de aplicar cambios de diseño a todas las páginas que la
componen, pues muchas veces implica tener que modificar cada una de
estas paginas.
l  La especificación JSP incluye mecanismos para poder reutilizar
fragmentos que pueden incluir en numerosas páginas. Para ello
disponemos de la directiva <@page include="fragmento.jsp">.
l  De esta forma podemos hacer inclusiones de pies de página, encabezados,
zonas laterales de menú, etc.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Introducción
l  De esta manera, cualquier operación de mantenimiento se podrá
realizar en los fragmentos y por lo tanto serán propagados por todas
las páginas afectadas. Pero esto a su vez conlleva un problema: ¿qué
ocurre si se toma la decisión de modificar la ubicación en la página de
uno de los elementos que hemos incluido mediante la directiva
include?. No tenemos más remedio que modificar todas la páginas y
cambiar el lugar donde se realiza el include.
l  Para resolver este problema, debemos introducir un concepto nuevo ya
utilizado en otras tecnologías para el diseño de interfaces de usuario, el de
"template" o plantilla y que no existe en la especificación JSP de J2EE.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Plantillas con Struts
l  Las plantillas definen no sólo los elementos reutilizables si no la
ubicación de los mismos. La idea consiste en especificar de manera
única, el diseño o "layout" de un conjunto de páginas. Esta plantilla sería lo
único que deberíamos cambiar en caso de querer modificar el diseño
común de esa parte de la aplicación.
l  En la plantilla se debe maquetar de manera que montaremos una
composición con los distintos elementos dinámicos de la página. Las
páginas concretas que se mostrarán, se limitarán a referenciar a una cierta
plantilla y asignarán el contenido de las distintas piezas que usa la plantilla
usada (cabecera, menú, pie y contenido).
l  Las vistas, por lo tanto, se compondrán de dos partes: por un lado la
plantilla propiamente dicha (layout) y por otro la página JSP que usará
dicha plantilla, definiendo el contenido al que hacemos referencia cuando
insertemos los distintos tiles. Ésta última será que será invocada por struts
en el proceso de redirección del flujo de la petición.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Composición de vistas con Struts Tiles
l  Una vez comprendido el concepto de plantilla vamos a pasar a ver como
definirlas mediante el uso de Struts Tiles. Afortunadamente no tenemos que
aprender un nuevo lenguaje o tecnología para diseñar las plantillas, ya que
éstas se definen en una JSP.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Layout
l  Echemos un vistazo al código donde hemos diseñado la plantilla principal
(layoutVerUno.jsp).
l  La base del código es fundamentalmente HTML, una tabla que en las
distintas celdas tendrá ubicadas las porciones a modo de tiles (ladrillos).
l  En primer lugar, usaremos la etiqueta <tiles:insert>, con ella daremos
valor a las distintas variables que se definen en la plantilla.
l  En el siguiente código veremos la forma que tendría la página
layoutVerUno.jsp. Podemos observar la ubicación de las distintas porciones
de la página.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Layout
l  layoutVerUno.jsp

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Vista JSP
l  Ahora sólo nos queda definir un JSP que haga uso en forma de plantilla
de este 'layout'. En la especificación del 'layout' anterior, utilizamos la
etiqueta <tiles:insert> para especificar un atributo que nos servirá para
indicar ahora en la plantilla cómo insertar el diseño de cada zona. Esta
página será la que será invocada en concepto de vista del caso de uso, en
nuestro caso verUno.jsp, por lo que no habrá que modificar el contenido de
struts-config.xml.
l  En esta página se definen aquellas partes variables que serán
referenciadas en la página "layout", por ejemplo header o copyright, y su
correspondiente relación con las jsp que lo componen, en el caso anterior
header.jsp y coyright.jsp. De la misma forma pueden aparecer
referencias directas a variables, mensajes, títulos, etc.. que actuarán como
si fueran pares de parámetros con su nombre y valor.
l  Veamos el código de esta página prestando especial atención a la etiqueta
page que indicará la plantilla a utilizar (layout).

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Vista JSP
l  Veamos el código de esta página prestando especial atención a la etiqueta
page que indicará la plantilla a utilizar (layout).

l  Es importante tener bien construidas las páginas de las que se compone la
vista, ya que un error en alguna de ellas puede ser incómodo de detectar.
Estas páginas actúan como fragmentos de jsp, por lo que no ser requiere
su definición completa. Digamos que sustituyen a la directiva include u
otros mecanismos nativos de jsp.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Vista JSP
l  Ejemplo de contenido, página contentVerUno.jsp

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Resultado de la ejecución

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Tema 9: Bibliotecas de etiquetas
l  Tabla de contenidos
¡ 
¡ 
¡ 
¡ 
¡ 
¡ 

Introducción
Uso de una librería de etiquetas
Biblioteca de etiquetas HTML
Biblioteca de etiquetas BEAN
Biblioteca de etiquetas LOGIC
Ejemplo biblioteca LOGIC

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Introducción
l  El uso de las bibliotecas de etiquetas separa el código java de las páginas
JSP. Esto nos permite crear páginas jsp que no contengan ni una sola línea
de código java. La lógica es ejecutada por las etiquetas.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso de una librería de etiquetas
l  En los primeros ejemplos del manual, cuando hemos creado la página de
entrada que contenía el formulario de registro, ya hemos utilizado las
bibliotecas de etiquetas. Las librerías deben ser acompañadas de su
correspondiente archivo tld (Tag Library Descriptor) y depende de la
especificación de Servlets/Jsp que usemos podremos usar las etiquetas
propias del Framework de una u otra forma.
l  Recordamos los pasos que debemos seguir:

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso de una librería de etiquetas
l  1. Las bibliotecas de etiquetas y sus descriptores deben formar parte de
nuestra aplicación:
¡ 
¡ 
¡ 
¡ 

struts-bean.tld
struts-html.tld
struts-logic.tld
…..

l  Los descriptores .tld encuentran en la carpeta lib del directorio de
instalación de struts o están empaquetadas en los archivos .jar de librerías,
depende de la distribución que se utilice.
l  El código compilado de estas etiquetas se encuentra en el archivo
struts.jar. No hemos de olvidar incorporar este archivo jar dentro del
directorio lib de nuestro WEB-INF.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso de una librería de etiquetas
l  2. Mediante el uso de la directiva taglib, importamos las bibliotecas de
etiquetas a la página jsp. Esto podemos hacerlo de dos maneras,
dependiendo de la especificación de Servlets que usemos.
A.  Referencia al tld (Tag Library Descriptor): usando la uri que referencia los
archivos descriptores de etiquetas .tld. Esto se hará incluyendo la siguiente
definición en el web.xml. Previamente las etiquetas deben estar ubicadas en un
directorio bajo WEB-INF
¡  web.xml

¡  Referencia en nuestra página a la uri en cuestión

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Uso de una librería de etiquetas
B.  Usando especificación 2.3 de Servlet: si usamos la especificación de
Sevlets 2.3, podemos obviar esta configuración (declaración en web.xml)
para usar directamente la uri que corresponde a cada uno de los grupos de
etiquetas personalizadas, delimitados por la definición de un .tld y cuya uri
está definida en el mismo.
¡  Referencia directa en la JSP

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Biblioteca de etiquetas HTML
l  Se utiliza fundamentalmente para construir formularios de entrada de datos.
Aunque también se utiliza para otras funciones como pueden ser: mostrar
mensajes de error, proporcionar enlaces con reescritura de URL incluyendo
el identificador de sesión, generar código de validación javascript, entre
otras.
l  En la siguiente tabla se muestran algunas de las más utilizadas:

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Biblioteca de etiquetas HTML

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Biblioteca de etiquetas BEAN
l  Proporciona una serie de etiquetas para trabajar con javabeans. Se
recogen en esta tabla los más comunes:

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Biblioteca de etiquetas LOGIC
l  Esta librería proporciona mecanismos para la presentación de datos al
usuario.

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Ejemplo biblioteca LOGIC
l  Vamos a ver un ejemplo de utilización de esta última librería.
l  1. Creamos un Action que introduzca una lista como atributo de la petición,
con todos los artículos de la cesta.
l  ConsultaAtculos.java

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Ejemplo biblioteca LOGIC
l  2. Configuramos la acción en el archivo struts-config.xml. Del siguiente
modo:

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Ejemplo biblioteca LOGIC
l  3. Creamos una página jsp a la que nos dirige el forward exito. En esta
página se utilizan las etiquetas de la biblioteca logic para iterar sobre la
coleccion.
¡  Esta lista, si miras el código del punto anterior, se ha introducido como atributo
de la petición. A este atributo hacemos referencia en la etiqueta <logic:present>
para determinar si existe o no tal atributo.
¡  El código de la página jsp es el siguiente:

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Ejemplo biblioteca LOGIC
l  verTodos.jsp

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es
Ejemplo biblioteca LOGIC
l  El resultado en ejecución:

Javier Oliver Fulguera

@javioliful

www.oliverfulguera.es

Más contenido relacionado

La actualidad más candente

9 tecnologías v1.1
9 tecnologías v1.19 tecnologías v1.1
9 tecnologías v1.1UTN
 
Introducción Spring Framework
Introducción Spring FrameworkIntroducción Spring Framework
Introducción Spring Frameworkecontinua
 
Diapositivas Spring Framework- Javier Oliver Fulguera
Diapositivas Spring Framework-  Javier Oliver FulgueraDiapositivas Spring Framework-  Javier Oliver Fulguera
Diapositivas Spring Framework- Javier Oliver FulgueraJavier Oliver Fulguera
 
[ES] Conectividad de java a base de datos(jdbc)
[ES] Conectividad de java a base  de datos(jdbc)[ES] Conectividad de java a base  de datos(jdbc)
[ES] Conectividad de java a base de datos(jdbc)Eudris Cabrera
 
Aplicaciones en capas1
Aplicaciones en capas1Aplicaciones en capas1
Aplicaciones en capas1mariana
 
Desarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on RailsDesarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on RailsFreelancer
 
ASP.NET MVC (2011)
ASP.NET MVC (2011)ASP.NET MVC (2011)
ASP.NET MVC (2011)wildtango
 
Entity Framework 4.0 y ASP.NET MVC 2 con VS2010 - JUTI XI - 2010
Entity Framework 4.0 y ASP.NET MVC 2 con VS2010 - JUTI XI - 2010Entity Framework 4.0 y ASP.NET MVC 2 con VS2010 - JUTI XI - 2010
Entity Framework 4.0 y ASP.NET MVC 2 con VS2010 - JUTI XI - 2010Desarrollos NEA
 
UDA-Anexo gestión de seguridad
UDA-Anexo gestión de seguridadUDA-Anexo gestión de seguridad
UDA-Anexo gestión de seguridadAnder Martinez
 
Org tutorial struts_2010
Org tutorial struts_2010Org tutorial struts_2010
Org tutorial struts_2010Omar Rios
 

La actualidad más candente (20)

01 introducción
01 introducción01 introducción
01 introducción
 
Spring Mvc Final
Spring Mvc FinalSpring Mvc Final
Spring Mvc Final
 
Spring framework
Spring frameworkSpring framework
Spring framework
 
9 tecnologías v1.1
9 tecnologías v1.19 tecnologías v1.1
9 tecnologías v1.1
 
Introducción a Spring framework
Introducción a Spring frameworkIntroducción a Spring framework
Introducción a Spring framework
 
Introducción Spring Framework
Introducción Spring FrameworkIntroducción Spring Framework
Introducción Spring Framework
 
Frameworks J2EE
Frameworks J2EEFrameworks J2EE
Frameworks J2EE
 
Framework
FrameworkFramework
Framework
 
Spring framework 3
Spring framework 3Spring framework 3
Spring framework 3
 
Diapositivas Spring Framework- Javier Oliver Fulguera
Diapositivas Spring Framework-  Javier Oliver FulgueraDiapositivas Spring Framework-  Javier Oliver Fulguera
Diapositivas Spring Framework- Javier Oliver Fulguera
 
[ES] Conectividad de java a base de datos(jdbc)
[ES] Conectividad de java a base  de datos(jdbc)[ES] Conectividad de java a base  de datos(jdbc)
[ES] Conectividad de java a base de datos(jdbc)
 
Spring framework
Spring frameworkSpring framework
Spring framework
 
Aplicaciones en capas1
Aplicaciones en capas1Aplicaciones en capas1
Aplicaciones en capas1
 
Desarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on RailsDesarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on Rails
 
Java Web - Struts
Java Web - StrutsJava Web - Struts
Java Web - Struts
 
ASP.NET MVC (2011)
ASP.NET MVC (2011)ASP.NET MVC (2011)
ASP.NET MVC (2011)
 
Entity Framework 4.0 y ASP.NET MVC 2 con VS2010 - JUTI XI - 2010
Entity Framework 4.0 y ASP.NET MVC 2 con VS2010 - JUTI XI - 2010Entity Framework 4.0 y ASP.NET MVC 2 con VS2010 - JUTI XI - 2010
Entity Framework 4.0 y ASP.NET MVC 2 con VS2010 - JUTI XI - 2010
 
spring
springspring
spring
 
UDA-Anexo gestión de seguridad
UDA-Anexo gestión de seguridadUDA-Anexo gestión de seguridad
UDA-Anexo gestión de seguridad
 
Org tutorial struts_2010
Org tutorial struts_2010Org tutorial struts_2010
Org tutorial struts_2010
 

Destacado (7)

Gestion informatica i
Gestion informatica iGestion informatica i
Gestion informatica i
 
J2me Presentacion
J2me PresentacionJ2me Presentacion
J2me Presentacion
 
Introducción a Java
Introducción a JavaIntroducción a Java
Introducción a Java
 
J2ME
J2MEJ2ME
J2ME
 
J2ME
J2MEJ2ME
J2ME
 
Fundamentos de programación Java
Fundamentos de programación JavaFundamentos de programación Java
Fundamentos de programación Java
 
Daily Routines Vocabulary
Daily Routines VocabularyDaily Routines Vocabulary
Daily Routines Vocabulary
 

Similar a Aplicaciones web con jakarta struts - Javier Oliver Fulguera

Similar a Aplicaciones web con jakarta struts - Javier Oliver Fulguera (20)

Documentacion struts2 laura.palma
Documentacion struts2 laura.palmaDocumentacion struts2 laura.palma
Documentacion struts2 laura.palma
 
Documentacion struts 2
Documentacion struts 2Documentacion struts 2
Documentacion struts 2
 
Documentacionstruts2 luiggi
Documentacionstruts2 luiggiDocumentacionstruts2 luiggi
Documentacionstruts2 luiggi
 
CakePHP
CakePHPCakePHP
CakePHP
 
Jsf Java Server Faces
Jsf   Java Server FacesJsf   Java Server Faces
Jsf Java Server Faces
 
S1-DS2.pptx
S1-DS2.pptxS1-DS2.pptx
S1-DS2.pptx
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
[ES] Introducción a las Aplicaciones Web con Java
[ES] Introducción a las Aplicaciones Web con Java[ES] Introducción a las Aplicaciones Web con Java
[ES] Introducción a las Aplicaciones Web con Java
 
Framework
FrameworkFramework
Framework
 
Framework
FrameworkFramework
Framework
 
Implementacion de un portal web para la automatización del proceso de consult...
Implementacion de un portal web para la automatización del proceso de consult...Implementacion de un portal web para la automatización del proceso de consult...
Implementacion de un portal web para la automatización del proceso de consult...
 
Presentacion mvc orm
Presentacion mvc ormPresentacion mvc orm
Presentacion mvc orm
 
01.springframework.pptx
01.springframework.pptx01.springframework.pptx
01.springframework.pptx
 
S1 ds2
S1 ds2S1 ds2
S1 ds2
 
Introducción al desarrollo de aplicaciones web en Java
Introducción al desarrollo de aplicaciones web en JavaIntroducción al desarrollo de aplicaciones web en Java
Introducción al desarrollo de aplicaciones web en Java
 
Manual 2014 i 04 lenguaje de programación ii (0870)
Manual 2014 i 04 lenguaje de programación ii (0870)Manual 2014 i 04 lenguaje de programación ii (0870)
Manual 2014 i 04 lenguaje de programación ii (0870)
 
Linea del tiempo de los frameworks
Linea del tiempo de los frameworksLinea del tiempo de los frameworks
Linea del tiempo de los frameworks
 
Plataforma de programación Java
Plataforma de programación JavaPlataforma de programación Java
Plataforma de programación Java
 
Manual programacion - java - jsp & xml
Manual   programacion - java - jsp & xmlManual   programacion - java - jsp & xml
Manual programacion - java - jsp & xml
 
Asp.net 4
Asp.net 4Asp.net 4
Asp.net 4
 

Último

Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptMiguelAtencio10
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..RobertoGumucio2
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxJOSEMANUELHERNANDEZH11
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxAlexander López
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaarkananubis
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxJOSEFERNANDOARENASCA
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxMariaBurgos55
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativaAdrianaMartnez618894
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptJavierHerrera662252
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELmaryfer27m
 

Último (20)

Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.ppt
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptx
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en mina
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptx
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptx
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativa
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFEL
 

Aplicaciones web con jakarta struts - Javier Oliver Fulguera

  • 1. Aplicaciones Web con Jakarta Struts Javier Oliver Fulguera Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 2. Tema 1: Introducción y arquitectura l  Tabla de contenidos ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  Introducción Modelos arquitectónicos Arquitectura MVC El Controlador (Controller) El Modelo (Model) La Vista (View) ¿Qué es un Framework? Framework Jakarta-Struts Alternativas a Struts Barracuda MVC Cocoon Expreso Freemarker, Velocity y Web Macro Maverick Spring Java Server Faces Instalando Struts Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 3. Introducción l  El framework (marco de trabajo) open source Struts se creó para permitir que los desarrolladores pudieran crear aplicaciones Web basadas en componentes web desarrollados con tecnología Java (Servlets y Java Server Pages). Al igual que ocurre con cualquier construcción, una aplicación debe asentarse sobre unos pilares que permitan crecer al resto de la estructura. La traducción al castellano de la palabra Strut define muy bien el propósito del proyecto, ya que actuaría como un puntal (pilar) sobre el que se soporta el peso del resto del desarrollo. l  El framework fue creado por Craig R. McCIanahan y donado a la Apache Fundation Software (ASF) en el año 2000, convirtiéndose poco después en una referencia para los desarrolladores de aplicaciones web. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 4. Modelos arquitectónicos l  Modelo 2 -> Este modelo se apoya en el patrón de diseño Model-ViewController, utilizando JavaBeans-JSPs-ServIets. Los javabeans representan al modelo de la aplicación, las páginas JSP a la vista, y los servlets actúan como controladores. l  MVC es tan común que se han desarrollado varias infraestructuras en torno a este patrón de diseño, entre ellas Apache Struts y Java Server Faces Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 5. Arquitectura MVC l  El Controlador (Controller) ¡  En este modelo un servlet central recibe las peticiones del cliente, procesa la URL recibida y delega el procesamiento de la lógica de la aplicación a los distintos JavaBeans. Estos generan un resultado que el servlet guarda en el contexto de la petición, la sesión o la aplicación. En un último paso, el servlet transfiere el control a un JSP que lleva a cabo la presentación de los resultados. l  El Modelo (Model) ¡  El modelo es el que maneja los datos y la funcionalidad de la aplicación. Los JavaBeans (o EJBs para aplicaciones más escalables) desempeñan el rol de modelo. En este papel, pueden ejecutar lógica de negocio o bien guardar datos. ¡  Normalmente, el servlet controlador invoca un método en el bean lógico y éste devuelve un bean de datos al que tiene acceso el diseñador de la página JSP. l  La Vista (View) ¡  Este papel es ejecutado por páginas JSPs. El servlet controlador transfiere el control al JSP después de haber guardado en un contexto el resultado en forma de un bean de datos. JSP usa las acciones jsp:useBean y jsp:getProperty para recuperar datos y formatear la respuesta en HTML o XML. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 6. Arquitectura MVC (II) Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 7. ¿Qué es un Framework? l  Es un conjunto de clases e interfaces que cooperan para solucionar un tipo específico de problema software. l  Tiene las siguientes características: ¡  Consta de múltiples clases o componentes, cada uno de los cuales puede proporcionar una abstracción de algún concepto determinado. ¡  Define cómo estas abstracciones trabajan conjuntamente para solucionar un problema. ¡  Sus componentes son reutilizables. ¡  Organiza patrones en un nivel superior. l  Un framework, además, debería proporcionar un comportamiento común a múltiples aplicaciones. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 8. Framework Jakarta-Struts l  Struts es una de estos frameworks basadas en MVC. Provee un conjunto de clases y taglibs (librerías de etiquetas personalizadas) que conforman el controlador, la integración con el modelo (o lógica de negocio) y facilitan la construcción de vistas. l  Las aplicaciones basadas en Struts constan de: ¡  Código Java ¡  Descriptores de despliegue (deployment descriptors) que configuran el framework para el uso de nuestra aplicación ¡  Struts nos proporciona una serie de elementos para la construcción de aplicaciones web: l  l  l  l  l  l  l  l  l  l  l  Javier Oliver Fulguera Un servlet (ActionServIet) que actúa como controlador MVC totalmente configurable. Clases base que son extendidas para implementar la lógica de la aplicación web: org.apache.struts.action.Action org.apache.struts.action.ActionForm Un conjunto de etiquetas personalizadas JSP que cooperan con el controlador para su uso en la parte de la vista de MVC Distintas opciones para la validación de entrada de usuario en formularios HTML: ActionForm Validator Framework Mecanismos para el tratamiento de errores Soporte para la internacíonalización (i18n) a través de ficheros de recursos y Java Locales Soporte para fuentes de datos @javioliful www.oliverfulguera.es
  • 9. Framework Jakarta-Struts l  Además el grupo Struts siempre da la bienvenida a nuevos participantes. Para convertirse en colaborador, se recomienda formar parte primero de la lista de distribución de Struts. Si te gusta lo que allí aparece puedes echar un vistazo a la lista de Struts Developers. La página principal del proyecto está ubicada en http://jakarta.apache.org/struts. Javier Oliver Fulguera @javioliful Página del proyecto Apache. www.oliverfulguera.es
  • 10. Alternativas a Struts l  Otros marcos de trabajo comparables a Struts pueden ser elegidos como alternativas a éste. A continuación se citan algunos de los proyectos más interesantes que han venido desarrollándose en los últimos tiempos: l  Barracuda MVC ¡  El entorno de trabajo es un tipo de de arquitectura similar al Modelo 2 de Struts, pero va más allá, proporcionando mecanismos de notificación basada en eventos al modelo. Además, proporciona vistas generadas en base a un motor de plantilla, y cuya formación se hace a través de XML (XMLC) y no exclusivamente JSP. Podemos encontrar más documentación en http://www.barracudamvc.org/Barracuda/docs/index.html. l  Cocoon ¡  Stefano Mazzocchi fundó este proyecto en enero de 1999 como un proyecto de código abierto bajo la ASF. El objetivo era separar el estilo de contenido , la lógica y las funciones de gestión para los sitios Web basados en XML. Influye por lo tanto en XML (XSLT,SAX) para ayudar a crear, desarrollar y mantener aplicaciones de servidor XML. Más información podemos encontrarla en http://cocoon.apache.org Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 11. Alternativas a Struts (II) l  Expreso ¡  Expresso, de Jcorporate, es un marco de desarrollo de aplicación que proporciona un marco de trabajo basado en componentes. Proporciona una serie de componentes principales compatibles tanto con aflicciones EJB como no EJB. Aunque completamente independiente de Struts y otros marcos, los componentes Expresso también se pueden integrar con Struts con el fin de añadir posibilidades de segundad, mapeado de objeto-a-relacional, gestión de trabajo en segundo plano, etc. Más información en http://www.jcorporate.com. l  Freemarker, Velocity y Web Macro ¡  Estos tres productos se agrupan por que representan tipos similares de motores de plantilla. Freemaker genera HTML dinámicamente utilizando datos proporcionados por servlets y mediante su propio lenguaje de plantilla. Velocity es otro proyecto Jakarta como Struts, pero va más allá de la generación de HTML ya que puede generar SQL, PostScritp y XML desde plantillas. Velocity utiliza un lenguaje de script ligero que separa la lógica de las páginas del aspecto. Más información sobre estos marcos se puede encontrar en http://freemaker.sourceforqe.net, http://jakarta.apache.org/velocity y http://www.webmacro.org. l  Maverick ¡  Ofrece la posibilidad de mostrar vistas utilizando JSP, el lenguage de script de Velocity o XSLT. Maverick es una arquitectura de tipo MVC paro proporciona un mecanismo de plantilla de vistas. Para más información se puede consultar http://mav.sourceforqe.net. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 12. Alternativas a Struts (III) l  Spring ¡  Es un marco para aplicaciones J2EE relativamente nuevo desarrollado por Rod Jonson. No solamente es un marco Web, sino que permite la posibilidad de estar integrado con otros componentes de naturaleza dispar. Consultar http://www.springframework.org. l  Java Server Faces ¡  Proporciona un conjunto estándar de etiquetas JSP, controladores, gestión de eventos, etc. Que no solamente permiten el desarrollo web, sino el de aplicaciones de naturaleza Java tales como Java Swing. Incluido en los estándares J2EE de Sun y cuya documentación podemos encontrarla en http://java.sun.com/javaee/javaserverfaces. l  Esta lista puede ser completada con SiteMesh, Jakarta Turbina, WebWork, además de marcos desarrollados por otras tecnologías tales como UIP (User Interface Process) de Microsoft cuyos objetivos son compartidos por Struts aunque desarrollados para su utilización en modelo de programación .NET. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 13. Instalando Struts l  Una aplicación de struts es una aplicación web, por lo que vamos a necesitar un servidor web y un contenedor de componentes web para su despliegue y ejecución. l  Necesitamos instalar la cualquiera de las versiones de Apache Struts, lo podemos hacer de la siguiente dirección: l  http://struts.apache.org/download.cgi o http://archive.apache.org/dist/struts l  En nuestro caso, descargaremos el fichero struts-1.2.7.zip. l  En el directorio webapps de la distribución de Struts se pueden encontrar varios ficheros .war muy útiles. ¡  ¡  ¡  ¡  Javier Oliver Fulguera struts-blank.war: Es la base para cualquier aplicación. struts-documentation.war: Documentación del framework. struts-examples.war: Aplicaciones de ejemplo. Etc. @javioliful www.oliverfulguera.es
  • 14. Tema 2: Primera aplicación l  Tabla de contenidos ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  Introducción Control de flujo en Struts Diagrama de clases Primer programa Petición http y Action La clase Action Las vistas El uso de Forward El archivo de configuración struts-config.xml El descriptor de despliegue de la aplicación (web.xml) La estructura de la aplicación Despliegue y ejecución Atención de la petición Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 15. Introducción l  En este capítulo vamos a desarrollar la típica aplicación de ejemplo al más puro estilo "HelloWorld". Para ello hemos de disponer de las herramientas, librerías ya comentadas en el capítulo anterior. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 16. Control de flujo en Struts l  Cuando programamos con servlet y JSP directamente, somos responsables del flujo de navegación. l  Para ello usamos RequestDispatcher u otros mecanismos que nos reencaminen hacia los componentes que determinemos en base a la información que el cliente nos proporciona en su petición http. l  No obstante, si usamos un framework como Struts El desarrollador será responsable de la lógica de negocio, de la vistas, etc.. pero no del control del flujo ni otros aspectos que se suponen comunes para este tipo de aplicaciones; validación, intemacionalización, etc. l  Este control se definirá de forma declarativa usando archivos xml. De esta forma damos flexibilidad a nuestras aplicaciones, pudiendo reutilizar el sistema de control de flujo en cada uno de los sistemas que estemos construyendo. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 17. Control de flujo en Struts (II) l  A continuación se citan los componentes que están implicados en una aplicación web en lo que al control de flujo y tratamiento de las peticiones se refiere: ¡  La clase org.apache.struts.action.ActionServIet es el eje de Struts. Dada una petición de entrada HTTP: 1.  Crea un objeto ActionForm donde guarda y valida los parámetros de entrada 2.  Decide qué objeto Action se debe invocar y le pasa el objeto ActionForm creado 3.  Transfiere el control a la siguiente etapa de procesamiento de la petición (típicamente un JSP). l  El fichero de configuración web.xml contiene los url mappings para enviar las peticiones de llegada al ActionServIet, mientras que el fichero de configuración de Struts struts-config.xml contiene los mappings a acciones Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 18. Control de flujo en Struts (III) l  Los formbeans creados por ActionServIet deben ser implementados por el programador, extendiendo org.apache.struts.action.ActionForm. ¡  El programador deberá definir un conjunto de getters y setter y sobreescribir los métodos validate() y reset() l  Los objetos Action invocados deben ser desarrollados por el programador y extienden org.apache.struts.action.Action. Tienen un método execute() que ejecuta la lógica de negocio. l  La acción devuelve un objeto ActionForward al servlet que especifica el siguiente paso a ejecutar, normalmente se transfiere el control a un JSP para que visualice los resultados. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 19. Diagrama de clases l  Diagrama: Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 20. Primer programa l  Vamos a crear el primer ejemplo con struts. Esta aplicación no tiene entrada, y el resultado de salida es el típico "Hola Mundo" de todos los lenguajes de programación. l  Copiar las siguientes librerías en la carpeta lib de WEB-INF: ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  antlr.jar commons-beanutils.jar commons-digester.jar commons-fileupload.jar commons-logging.jar commons-validator.jar jakarta-oro.jar struts.jar l  Estas librerías se encuentran en la carpeta lib del directorio de instalación de struts. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 21. Petición http y Action l  Las acciones responden a peticiones http (request). Cuando escribimos un Action hemos de extender de la clase org.apache.struts.action.Action y sobreescribir su método execute. Este método servirá para el tratamiento de la petición. l  El método execute devuelve un ActionForward. Podemos pensar en un ActionForward como en una vista de salida, o lo que es lo mismo, dependiendo el ActionForward que hayamos obtenido, se reencaminará el flujo hacia una vista u otra. l  El método execute recibe cuatro argumentos: ¡  ¡  ¡  ¡  un ActionMapping un ActionForm un HttpServIetRequest un HttpServIetResponse l  El ActionMapping es el objeto en el que se manifiesta el elemento XML usado para configurar el Action en el fichero de configuración de struts. El ActionMapping contiene un grupo de ActionsForwards asociados con la acción actual. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 22. La clase Action l  Siguiendo lo expuesto con anterioridad.La clase Action será la que se corresponda con el caso de uso que se está desarrollando. Esta clase Action nos lleva hacia una vista de salida llamada bien, o hacia una vista de salida llamada error, dependiendo del valor de un parámetro de la petición. Estas vistas de salida, ActionForward, serán páginas JSP (hola.jsp y error.jsp) Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 23. Las vistas l  La página de error y la de bienvenida, son similares. Utilizarán de forma muy básica los recursos que la tecnología JSP nos proporciona. Sin entrar en detalles que más adelante comentaremos, tales como desacoplamiento de mensajes, internacionalización, validación, etc. error.jsp Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 24. Las vistas (II) hola.jsp Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 25. El uso de Forward l  Un forward es una vista de salida, como hemos dicho. l  Pero lo único que hemos puesto como argumento en el método findForward de la clase ActionForward, ha sido un nombre lógico, no una dirección, esto nos permitirá mayor desacoplamiento entre las distintas partes de la arquitectura, pero debemos proporcionar una forma de relacionar este nombre lógico con una URL que nos dirija hacia el forward de salida. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 26. El archivo de configuración strutsconfíg.xml l  Para ligar los nombres lógicos de la redirección anteriormente establecida y las vistas asociadas a los mismos debemos actuar en el archivo de configuración de struts. l  El fichero de configuración de struts se llama struts-confíg.xml. l  Esta correspondencia entre el nombre lógico del forward, y la url de la página jsp de salida, se establece en el elemento action-mappings. Este elemento contiene los elementos action. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 27. El archivo de configuración strutsconfíg.xml (II) l  En el caso del ejemplo, este fichero de configuración es como se muestra a continuación: l  struts-confíg.xml Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 28. El archivo de configuración strutsconfíg.xml (III) l  El elemento action tiene dos atributos: ¡  path ¡  type url lógica que representa a la acción nombre totalmente cualificado de la clase Action l  El elemento action contiene los elementos forward. Mediante los atributos name y path de este elemento, se asocia el nombre lógico del forward con la url de la página jsp. l  La ubicación de este fichero de configuración de struts, struts-config.xml, se especifica como parámetro de incicialización del ActionServIet de struts, dentro del archivo web.xml de la aplicación web. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 29. El descriptor de despliegue de la aplicación (web.xml) l  En el caso del ejemplo, el archivo web.xml es como se muestra a continuación: Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 30. El descriptor de despliegue de la aplicación (web.xml) (II) l  En este archivo de configuración web.xml se indica que todas las url de extensión .do sean procesadas por el ActionServIet de struts. Este ActionServIet lee el fichero de configuración struts-config.xml donde se han asociado previamente los nombres lógicos de los forward con las url de las páginas jsp de salida. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 31. La estructura de la aplicación l  La estructura de nuestra primera aplicación web deberá corresponder a la estructura que J2EE especifica para los módulos web. En nuestro caso será la siguiente: Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 32. Despliegue y ejecución l  Para ejecutar la aplicación, debemos asegurarnos de tener arrancado el servidor y usando un navegador web, realizar la petición sin olvidar el sufijo .do y acorde a como la hayamos definido en el struts-config.xml. Además, pasaremos el parámetro de la petición en la misma barra de direcciones. l  El resultado en ejecución se muestra a continuación: Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 33. Despliegue y ejecución (II) l  Si omitimos el argumento, el resultado cambia: Dependiendo del valor del parámetro se muestra una vista u otra. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 34. Atención de la petición l  El siguiente diagrama no da perfecta idea del comportamiento que tiene una aplicación struts cuando atiende una perición http de forma genérica. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 35. Tema 3: Integración con la capa de datos l  Tabla de contenidos ¡  ¡  ¡  ¡  Usando JDBC con Struts DataSources Configuración del DataSource Implementación del nuevo caso de Uso El objeto de negocio y el DAO Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 36. Usando JDBC con Struts DataSources l  El uso de Struts DataSources, fuentes de datos de struts, nos permite obtener los beneficios de los datasources sin depender de ninguna implementación propietaria. Por una parte, esto hace que nuestra aplicación sea más portable y por otro, no estamos obligados a usar alguna de las características más avanzadas de la implementación particular, si es que no fuera necesario. l  Para trabajar con struts datasources vamos a necesitar dos nuevas librerías .jar: ¡  commons-pooling.jar ¡  commons-dbcp.jar l  Estas librerías no vienen con la instalación de struts, así que tenemos que descargarlas de la siguiente dirección de internet: l  http://jakarta.apache.org/site/downloads/downloads commons-pool.cgi l  http://jakarta.apache.org/site/downloads/downloads commons-dbcp.cgi Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 37. Configuración del DataSource l  Lo primero que tenemos que hacer es configurar el datasource dentro del archivo de configuración de struts (struts-config.xml). Para ello existe el elemento data-sources, que contiene tantos data-source como fueran necesarios en nuestra aplicación. En el caso de nuestro ejemplo, la configuración del datasource queda como se muestra a continuación: l  Fragmento struts-config.xml Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 38. Configuración del DataSource (II) l  El datasource se marca con una clave, que es el atributo key, que servirá, dentro de la clase Action que lo maneje, para obtener el objeto en caso de que haya más de un DataSource declarado. Mediante el uso de las distintas propiedades se establece nombre de la clase del driver, la URL de conexión, las características del pool de conexiones que maneja el contenedor, etc.. Javier Oliver Fulguera @javioliful
  • 39. Configuración del DataSource (III) l  El código de la clase Action que maneja el DataSource es el que se muestra a continuación: consultarTodos.java l  Javier Oliver Fulguera @javioliful
  • 40. Implementación del nuevo caso de Uso l  Para poder dotar a nuestra aplicación del nuevo caso de uso (el catálogo de artículos) debemos hacer las siguientes modificaciones en nuestra aplicación: 1.  Añadir la declaración del DataSource en struts-config.xml. Este paso ya ha sido expuesto anteriormente 2.  Añadir la nueva acción "verArticulos", junto a la clase Action que lo implementa así como su vista asociada "verTodos.jsp". 3.  Recorrer en la vista la colección de Artículos. La página verTodos.jsp, es parte de la vista, no es motivo de estudio en este ejemplo. No obstante adelantamos que el cometido de la misma es recuperar de la petición (request) una colección de "Transfer Objects" y llevar a cabo su recorrido para mostrarla de forma atractiva al usuario. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 41. Implementación del nuevo caso de Uso l  verTodos.jsp Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 42. El objeto de negocio y el DAO l  Articulo.java Javier Oliver Fulguera @javioliful
  • 43. El objeto de negocio y el DAO (II) l  ArticuloDAO.java Javier Oliver Fulguera @javioliful
  • 44. El objeto de negocio y el DAO Obtener la conexión del Contexto l  Si queremos conseguir el origen de datos del contexto de la aplicación deberemos registrarlo en el archivo del Tomcat: conf/Context.xml l  Y posteriormente obtenerlo por JNDI en el ADO o donde queramos) Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 45. Tema 4: Manejo de formularios l  Tabla de contenidos ¡  Introducción l  l  l  l  l  l  l  Form Beans Definición de un Form Bean Ejemplo de un Form Bean Configuración del Form Bean Lógica de negocio (Action) Mostrando la información obtenida Ejecución de la aplicación ¡  Validación de formularios Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 46. Introducción l  En este capítulo mostraremos la forma de interactuar por parte de los usuarios con nuestra aplicación struts mediante el uso de formularios y de los distintos tipos de componentes ActionForm que se generan en cada llamada. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 47. Form Beans Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 48. Form Beans l  Un ActionForm es un JavaBean con propiedades que corresponden a los controles de un formulario HTML. l  Los parámetros son mapeados a propiedades del bean. l  Estos componentes proveen un mecanismo de validación que es necesario para asegurarnos que el usuario introduce los datos esperados. En definitiva, actúan como puente entre el navegador y lo objetos de negocio. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 49. Definición de un Form Bean l  El programador define un form bean extendiendo la clase org.apache.struts.action.ActionForm. También puede definirse de forma declarativa usando usando org.apache.struts.action.DynaActionForm. Además, deben tener las siguientes características: ¡  Hay que definir cada una de las propiedades en la clase y escribir los getters/ setters correspondientes, siguiendo las reglas de la convención de nombres de los 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 l  Cada vez que se llama a la acción , el ActionServIet rellenará las propiedades con los valores de los parámetros recibidos en el formulario HTML que deberá ser definido usando etiquetas de la librería de Struts. l  Nota: Las propiedades no sólo pueden ser escalares sino que también pueden ser colecciones de valores. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 50. Ejemplo de un Form Bean l  Supongamos que deseamos consultar un artículo de nuestro catálogo. Para ello proporcionaremos un formulario en nuestra página de entrada de datos que llamaremos verUnoInput.jsp, y cuyo fragmento de código se muestra a continuación en lo que al formulario se refiere. l  verUnoInput.jsp (código) l  verUnoInput.jsp (en navegador) Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 51. Ejemplo de un Form Bean (II) l  Necesitaremos un Form Bean que ecapsule la información de la cajita de texto ("id") que usuario rellenará con el valor de la clave primaria del articulo que se está buscando, esta propiedad deberá hacerse corresponder con la propiedad "id" el Form Bean (Action Form). l  Veamos el código de VerUnoForm.java. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 52. Ejemplo de un Form Bean (III) Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 53. Configuración del Form Bean l  Al igual que el resto de componentes, hemos de dar de alta en el fichero de configuración de struts el componente, dándole un nombre para poder asociarlo con una acción. l  En fichero hemos de indicar además la clase que implementa el form. En nuestro ejemplo, la clase es app.view.VerUnoForm y le hemos dado el nombre verUnoForm. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 54. Fragmento de struts-config.xml Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 55. Lógica de negocio (Action) l  Por supuesto todo esto no vale para nada si detrás no hay el correspondiente Action que obtiene la información del bean e invoca a la lógica de negocio. l  Es importante observar el modo de hacer el casting hacia el tipo de Form Bean adecuado y que previamente hemos definido unas líneas más arriba. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 56. Lógica de negocio (Action) (II) Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 57. Mostrando la información obtenida l  Tal y como expusimos en el capítulo anterior durante el desarrollo del caso de uso verTodos, mostramos a continuación el fragmento de código que permitirá recuperar del request un objeto y acceder a sus propiedades. Para ello utilizaremos etiquetas personalizadas logic l  verUno.jsp Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 58. Ejecución de la aplicación l  Si introducimos un indentificador acorde a la validación que hemos hecho en el Action Form obtendremos el resultado esperado. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 59. Ejecución de la aplicación (II) ! Si por el contrario dejamos el campo de texto en blanco, volveremos a la pagina verUnoInput.jsp Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 60. Tema 5: Validación de formularios l  Tabla de contenidos ¡  Validación de formularios l  Framework Validator ¡  Introducción l  Uso del Framework Validator l  Respecto al Action ¡  ¡  ¡  ¡  Ejecución de la aplicación Reglas de validación comunes Validación en el lado del cliente con JavaScript Uso y Validación de DynaActionForms l  Validación de un DynaActionForm l  Lectura de propiedades de un DynaActionForm ¡  Validación del lado del cliente Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 61. Validación de formularios l  Como hemos visto, es de vital importancia por muchos motivos la correcta introducción de los datos por parte del usuario. Aquellos datos que el cliente no introduzca correctamente, formato, longitud, etc.. no deberían viajar al servidor por lo que una capa de verificación (validación de datos) por JavaScript del lado el cliente puede ser interesante. Proponemos una solución para realizar una validación básica que permita obtener con el mínimo esfuerzo esta capa software. Se trata del Framework Validator Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 62. Framework Validator l  Introducción l  El Framework Validator se utiliza para validar campos. La validación de un campo determinado se puede realizar en múltiples formularios. Por ejemplo, el código postal de un usuario se debe validar en el formulario de registro y también en un formulario de pedido. Podemos escribir dicha validación en el método valídate de cada uno de los ActionForm, duplicando el código, o podemos crear un mecanismo general de validación para todos los códigos postales que manejemos en nuestra aplicación. l  Existen muchas reglas de validación que podemos usar y además, tenemos la posibilidad de crear nuestras propias reglas en caso de que fuera necesario. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 63. Uso del Framework Validator l  Para introducirnos en la utilización de este framework, vamos a seguir de nuevo, paso a paso el ejemplo que estamos desarrollando a lo largo del manual. Vamos a validar el nombre de usuario del formulario de registro. Las reglas que establecemos para darlo por válido son: ¡  Que tenga un mínimo de 3 caracteres ¡  Que tenga un máximo de 8 caracteres Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 64. Uso del Framework Validator l  Hemos de seguir los siguientes pasos: l  1. Lo primero que tenemos que hacer es añadir el plug-in Validator en el fichero de configuración de struts. El framework Validator se integra con struts a través de este plug-in, el cual es responsable de leer los ficheros de configuración para las reglas de validación. El elemento plug-in debe incorporarse al fichero de configuración de struts después de cualquier elemento message-resources. En el caso de nuestro ejemplo, el fichero de configuración struts-config.xml se completa como se muestra a continuación: l  Struts-config.xml Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 65. Uso del Framework Validator l  2. Hemos de copiar los archivos validator-rules.xml y validation.xml dentro de la carpeta WEB-INF de nuestra aplicación. Estos archivos se encuentran en la aplicación de ejemplo que viene con la instalación de struts (struts-blank.war). l  Por el momento no vamos a modificar el archivo validator-rules.xml, ya que vamos a utilizar las reglas de validación que nos proporciona struts. l  El archivo validation.xml nos proporciona el mapeo entre la propiedad del ActionForm, las reglas de validación que se le aplican y el mensaje de error correspondiente. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 66. Uso del Framework Validator l  3. Hemos de cambiar la clase ActionForm con la que trabajamos (RegistrarUsuarioForm.java) para que extienda de org.apache.struts.validator.ValidatorForm. Esta clase es el nexo de unión entre Struts y el framework Validator. l  La clase ValidatorForm sobrescribe el método validate() y le comunica al framework Validator que aplique las reglas de validación a los campos de este formulario. l  Así que modificamos el código del formulario para que quede de la siguiente manera: Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 67. Uso del Framework Validator l  VerUnoValidatorForm.java Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 68. Uso del Framework Validator l  Añadimos el formulario dentro del archivo validation.xml, del siguiente modo: l  Validation.xml l  Un detalle importante. Como valor del atributo name para el form, se ha puesto el mismo nombre que lo asociaba a su action en el archivo struts-config.xml l  struts-config.xml Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 69. Uso del Framework Validator l  4. Añadimos un elemento field a la declaración del formulario en el archivo validation.xml correspondiente al campo usuario. Después le asociamos las distintas reglas de validación que le queremos aplicar: l  El atributo depends toma como valor la lista de reglas aplicables al campo, separadas por comas. En este caso se asocian las reglas required, minlength y maxlength. Estas reglas se encuentran definidas dentro del archivo validatorrules.xml y forman parte del framework Validator. Por ejemplo, si miramos la regla para minlength en el archivo validator-rules.xml, vemos lo siguiente: Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 70. Uso del Framework Validator l  validator-rules.xml l  En esta definición se asocia el nombre de la regla con la clase utilizada para la validación y que implementa la regla, y la clave para el mensaje que el framework debe mostrar en caso que se produzca un error en la validación. Esta clave debe asociarse al mensaje dentro del archivo de recursos de la aplicación. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 71. Uso del Framework Validator l  5. Añadimos los mensajes de error con sus claves dentro del archivo de recursos de la aplicación. Podemos tomar como ejemplo los proporcionados por el archivo validator-rules.xml de la aplicación de ejemplo de struts: l  MessageResources.properties Javier Oliver Fulguera @javioliful
  • 72. Uso del Framework Validator l  Este fichero debe ser alojado en la aplicación y declarado en strutsconfig.xml. Contendrá a modo de pares clave, valor los mensajes que se deberán ir mostrando en cualquiera de los aspectos de la aplicación; errores, mensajes de advertencia, títulos, etc. l  La declaración en el struts-config.xml se hará de la siguiente forma. l  struts-config.xml l  La ubicación y su localización tendrá la misma forma que las clases Java, por lo que en el caso de nuestro ejemplo, "app.view.ApplicationResources" nos indicará que el fichero está en el directorio .../WEB-INF/classes/app/view. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 73. Uso del Framework Validator l  Podemos adaptar nuestro archivo de recursos y adaptarlos a nuestras necesidades, incluyendo literales, variables etc. l  Fragmento de nuestro ApplicationResources.properties l  Observa que los mensajes de error toman un argumento en el caso de la regla required y dos en las otras dos reglas. Hemos de configurar estos argumentos. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 74. Uso del Framework Validator l  6. El primer argumento del que se habla en el punto anterior, va a indicar la etiqueta del campo validado, y el segundo el número de caracteres que se permiten como máximo y mínimo respectivamente. Esto se ha de configurar en el archivo validation.xml: l  Se incluye un elemento <var> por cada parámetro que se evalúa Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 75. Uso del Framework Validator l  Observamos de nuevo el mensaje error asociado a la clave de longitud mínima: l  El argumento {0} lo leemos del archivo de recursos de nuestra aplicación. Es decir, en <arg0 key="verUno.id"/> observamos la clave "verUno.id", así {0} será el literal asociado a dicha clave en ApplicationResources.properties, pero el segundo corresponde al valor que hemos asociado a la variable minlength. Es decir, este dato no lo obtenemos del archivo de recursos, sino de la propia variable definida en el archivo validation.xml mediante el par de entradas <var-name>/<var-value> y asociada al argumento <arg1>. En definitiva, y resumiendo: {0}, {1}, {2} se sustituirá por <arg0>, <arg1> y <arg2>. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 76. Respecto al Action l  Recordemos que el Action (verUnoAction), es decir, el objeto que ecapsula las llamadas a la lógica de negocio, usaba la clase verUnoForm para obtener la información del exterior ("id"). Ahora hemos alterado esta situación, ya que usamos verUnoValidatorForm y por tanto habrá que hacer modificaciones en la clase, ya que el casting debe ir hacia esta clase y no la anterior. Es muy común, por otra parte, olvidar este pequeño detalle, dando lugar a errores de incómoda búsqueda. l  En este ejemplo nos crearemos un Actión nuevo para hacer la prueba. l  Fragmento de VerUnoActionValidator.java Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 77. Respecto al Action l  Tambíen nos crearemos un jsp nuevo para la prueba, pues tendrá que llamar nuevo Action. l  Fragmento de verUnoInputValidator.jsp l  Configuración definitiva en del action en el struts-config.xml l  struts-config.xml Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 78. Ejecución de la aplicación l  Si ejecutamos la aplicación ahora, y no cumplimos con los requisitos del campo, struts nos redireccionará el flujo de la aplicación de nuevo al input, en nuestro caso verUnoInputValidator.jsp. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 79. Reglas de validación comunes l  En la siguiente tabla se recogen las reglas de validación que incluye el framework Validator Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 80. Validación en el lado del cliente con JavaScript l  Es bastante común realizar una validación en el lado del cliente con javascript. Esto evita que los datos viajen al servidor mientras no cumplan las condiciones de validación. El framework Validator tiene un mecanismo para generar código JavaScript. Para utilizar javascript tenemos que hacer lo siguiente: l  1. Añadimos una etiqueta html:javascript a la página jsp, del siguiente modo: Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 81. Validación en el lado del cliente con JavaScript l  2. Para validar el formulario en el lado del cliente tenemos que añadir a la etiqueta html:form el atributo onsubmit, del siguiente modo: l  Importante: El nombre del método valídate, se forma acompañando al valor del atributo formName anterior, empezando con mayúscula. l  Si el valor de retorno es false, los datos no se envían al servidor. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 82. Validación en el lado del cliente con JavaScript l  Si hacemos los cambios mencionados, y accedemos a la página jsp de alta de usuario, podemos ver el código javascript generado: Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 83. Uso y Validación de DynaActionForms l  Una de las primeras críticas que recibieron las primeras versiones de Struts, fue que se consideraba que era tedioso tener que crear una clase ActionForm por cada formulario (clase sencilla pero que suponía tener los correspondientes get() y set() de cada dato). l  Esto además suscita un problema en la teórica separación de roles, ya que tanto los diseñadores de JSP como los programadores de los Actions, debían ponerse de acuerdo en los campos de los formularios, pues si no se producirán. l  Los desarrolladores demandaron alguna forma más ágil y dinámica de declarar estos componentes por lo que desde la versión 1.1 de Struts se cuenta con los DynaActionsForms. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 84. Uso y Validación de DynaActionForms l  Estos ActionForms deberán ser declarados en el fichero strutsconfig.xml, de manera que quedarán a modo de entradas xml la definición de los campos y los tipos de datos de cada ActionForm. l  La diferencia con los ActionForms tradicional reside en que se añaden las etiquetas "<form-property>" para definir cada uno de los campos. Para cada campo hay que declarar su nombre ("name"), el tipo de dato ("type") y, opcionalmente, un valor inicial ("inicial"). Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 85. Uso y Validación de DynaActionForms l  Los tipos de datos aceptados por los ActionForm de tipo DynaActionForm son: ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  ¡  BigDecimal Biglnteger Boolean Byte Character Double Float Integer Short Long String Date Time Timestamp Tipo primitivos (int, char, long....) Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 86. Uso y Validación de DynaActionForms l  Configuración de DynaActionForm en el Struts-config.xml l  Definición del form-bean: Podemos observar en la propiedad id declarada en la etiqueta <form-property name="id“ type="java.lang.string"/>, que recordemos que es la usada para obtener los Articulo en cuestión. l  Definición del Action: Los únicos cambios que se dan en el struts-config.xml. El caso de uso relacionado con la acción verUno se verá afectado ya que usaremos ahora verUnoDynaActionForm, declarado en la etiqueta <action path="/verUno" input="/verUnoInput.jsp" name="verUnoDynaActionForm">. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 87. Validación de un DynaActionForm l  La validación en un DynaActionForm no requiere grandes cambios, tan solo modificaciones en el archivo validation.xml. Las reglas de validación, seguirán siendo las mismas y por lo tanto el framework validator sequirá actuando de la misma forma: l  Fragmento afectado del validation.xml: Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 88. Lectura de propiedades de un DynaActionForm l  Como hemos visto en el tratamiento de las peticiones, es la case Action la encargada de tratar la peticiones y, por lo tanto, de extraer los parámetros del Java Bean (ActionForm) correspondiente. La extracción de las propiedades del un ActionForm tradicional (con o sin validación) se basaba en la llamada al método getXyz(), siendo Xyz la propiedad en cuestión. l  Usando DynaActionForms, no hay tales métodos getXyz() ni set Xyz(), ya que las propiedades se generarán de forma dinámica y no hay una clase de respaldo que modele las mismas. La forma de extraer la información será a partir del método get("xyz") disponible en la clase org.apache.struts.action.DynaActionForm. Veamos la porción de código afectada. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 89. Lectura de propiedades de un DynaActionForm l  Fragmento de Action afectado: Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 90. Validación del lado del cliente. l  Ya hemos justificado la necesidad de validar los datos de entrada en el lado del cliente usando rutinas JavaScript. Es evidente que el uso de DynaActionForm no condiciona el mecanismo general de validación, no obstante hay que tener en cuenta los cambios a realizar en las páginas JSP para evitar sorpresas en tiempo de ejecución. Vemos a continuación el código de verUnoInput.jsp. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 91. Validación del lado del cliente. l  verUnoInput.jsp (modificaciones) Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 92. Tema 6: Tratamiento de excepciones l  Tabla de contenidos ¡  Excepciones con struts ¡  Tratando excepciones globales Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 93. Excepciones con struts l  En todos los programas se producen errores. Nuestro trabajo como programadores es evitar que el usuario final se encuentre con un resultado desagradable si esto sucede. Lo más probable es que no queramos que el usuario de nuestro sitio web vea un stack trace de error que posiblemente no entienda. l  En el caso del ejemplo que nos ocupa, si tratamos de consultar un Articulo que no existe en nuestro catálogo, la aplicación retornará una DAOException, provocada por ArticuloDAO. En definitiva una excepción de Usuario. Trabajando con struts podemos definir un manipulador de excepciones (exception handler) para manejar la excepción. Un exception handler nos permite manipular una excepción de manera declarativa en el archivo de configuración struts-config.xml asociando una excepción a un mensaje comprensible por el usuario dentro de una página jsp que será mostrada al usuario si la excepción ocurre. l  Vamos a seguir los siguientes pasos: Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 94. Excepciones con struts l  1. Creamos una página jsp llamada registroException.jsp en la raíz de nuestra aplicación. En ella incorporamos la etiqueta html:errors para mostrar el mensaje asociado con la excepción: l  registroException.jsp Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 95. Excepciones con struts l  2. Añadimos una entrada en el archivo de recursos de la aplicación, ApplicationResources.properties bajo la clave errors.verUno.exception, que explique la naturaleza del problema en términos que el usuario final pueda entender fácilmente. Por ejemplo: l  ApplicationResources.properties Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 96. Excepciones con struts l  3. Añadimos un exception handler en el action mapping para /verUno que maneje la excepción app.modelo.DAOException del siguiente modo: l  Struts-config.xml l  Observa que el elemento exception tiene tres atributos: ¡  key.- asocia el exception handler con una entrada del archivo de recursos. ¡  type.- Asocia el exception handler con el tipo de la excepción a tratar. ¡  path.- asocia el exception handler con la página jsp que se muestra si la excepción ocurre. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 97. Excepciones con struts l  El resultado en ejecución: Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 98. Tratando excepciones globales l  Al igual que se pueden tener forwards globales, independientes de cualquier acción, también podemos definir un tratamiento global a las excepciones, es decir, independientemente de la acción que las provoque. l  Una acción particular puede establecer el tratamiento de una excepción que haya sido definida como global exception. El caso particular predomina sobre el general. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 99. Tratando excepciones globales l  Para definir un tratamiento global de las excepciones, seguimos los siguientes pasos: l  1. Definimos una entrada para la excepción en el archivo de recursos de la aplicación: l  ApplicationResources.properties Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 100. Tratando excepciones globales l  2. Dentro del archivo de despliegue de la aplicación, struts-config.xml, definimos un elemento gobal-exceptions, que contiene tantos elementos exception como excepciones queramos tratar. l  struts-config.xml l  El elemento exception tiene tres atributos: ¡  key.- Corresponde a la entrada dentro del archivo de recursos de la aplicación. ¡  type.- Tipo de excepción tratada. ¡  handler.- Nombre totalmente cualificado de la clase que trata el evento. Esta clase debe extender de org.apache.struts.action.ExceptionHandler. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 101. Tratando excepciones globales l  Escribimos la clase que extiende de ExceptionHandler. En el caso del ejemplo, el código es el que se muestra a continuación: l  GestorProblema.java Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 102. Tratando excepciones globales l  Esta clase tiene un método execute que, entre otros, recibe como argumento un objeto de la clase Exception. Dentro del método execute se codifica la respuesta a la excepción. En este caso se imprime la traza de la excepción en la salida estándar del servidor de aplicaciones, y se dirige al usuario hacia la vista de salida marcada con el nombre problemaGenerico. l  Este forward se incluye en el archivo descriptor de despligue strutconfig.xml dentro del elemento global-forwards Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 103. Tratando excepciones globales l  Si se produce el error, se muestra al usuario la página html de error. En el caso de nuestro ejemplo, si se produce un error inesperado se muestra al usuario la siguiente vista de salida: Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 104. Tema 7: Internacionalización l  Tabla de contenidos ¡  ¡  ¡  ¡  Internacionalización (I18N) Configuración de nuestro navegador Mostrando mensajes variables La etiqueta <bean:message> Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 105. Internacionalización (I18N) l  Trabajando con struts podemos hacer, de forma sencilla, que nuestra aplicación se presente ante el usuario en el idioma que tenga configurado como preferido en su navegador. O bien mostrarla en el que el usuario elija de los distintos propuestos en una página de inicio. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 106. Configuración de nuestro navegador l  Cada región (geográfica, política o social) se identifica mediante un estándar formado por dos letras minúsculas. Podemos ver las distintas combinaciones en el cuadro de configuración del idioma de nuestro navegador: Para el idioma inglés, por ejemplo, existen distintas combinaciones de letras, según la región, así como para otros idiomas como el español o el francés. Javier Oliver Fulguera @javioliful
  • 107. Elegir el idioma l  Vamos a hacer que nuestra aplicación se muestre en inglés o en español, según el idioma preferido del usuario. Pero también podemos inventarnos nuevos idiomas usando sufijos a nuestra conveniencia. Seguimos los siguientes pasos: l  1. Dentro del archivo struts-config.xml, añadimos la siguiente acción: l  En el action podremos modificar de forma programática el idioma y no sólo para idiomas predefinidos sino que podremos mostrar nuestros propios dialectos. En nuestro caso pasaremos la cadena del dialecto escogido usando parámetros de un formulario o directamente en la url. .../ cambiarIdioma?lenguaje=xx, donde xx puede ser un idioma inventado o bien cualquiera que los estándares definen. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 108. Elegir el idioma l  CambiarldiomaAction. java Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 109. Elegir el idioma l  2. Para que las etiquetas del formulario se muestren en un idioma determinado, hemos de incorporar tantos archivos de recursos como idiomas se contemplen. Estos archivos deben contener en su nombre la representación estándar del idioma. En nuestro caso teníamos el archivo de recursos ApplicationResources.properties y ahora hemos de incorporan uno nuevo, ApplicationResources_xx.properties. Dentro de este archivo, y asociados a las mismas claves que el primero, se encuentran los mensajes en el idioma xx: l  Fragmento de ApplicationResources_en.properties Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 110. Elegir el idioma l  Podemos crear cuantos archivos paralelos deseemos, cuyos sufijos nos indicarán el idioma en que queremos trabajar. ¡  ¡  ¡  ¡  ApplicationResources_en.properties ApplicationResources_en_GB.properties ApplicationResources_es.properties ApplicationResources_xx.properties l  Si disponemos de estos archivos en nuestra aplicación, no será necesario definir ningún idioma al arrancar la misma, a no ser que queramos alterarlo de forma manual usando la acción cambiarIdioma.do, ya que el navegador tendrá definido un idioma por defecto y en cada petición será detectado y tratado de forma automática por struts. Enviando los mensajes según corresponda. l  Si configuramos el navegador en un idioma no contemplado por la aplicación, ésta se mostrará en el idioma por defecto, es decir, mostrando las etiquetas del archivo ApplicationResources.properties. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 111. Mostrando mensajes variables l  Más allá de los mensajes de error y otros, podemos mostrar texto plano o con formato, desacoplado de la presentación en cuanto al idioma se refiere. Para ello debemos usar las etiquetas personalizadas. ¡  La etiqueta <bean:message> l  Permite mostrar mensajes desde el archivo de recursos de la aplicación. El mensaje será el asociado a la clave, indicada en el atributo key. l  ApplicationResources.properties l  Cualquier JSP Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 112. Resultado de la ejecución Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 113. Tema 8: Composición de vistas l  Tabla de contenidos ¡  ¡  ¡  ¡  ¡  ¡  Introducción Plantillas con Struts Composición de vistas con Struts Tiles Layout Vista JSP Resultado de la ejecución Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 114. Introducción l  Un problema común a la hora de mantener un sitio Web suele consiste en la dificultad de aplicar cambios de diseño a todas las páginas que la componen, pues muchas veces implica tener que modificar cada una de estas paginas. l  La especificación JSP incluye mecanismos para poder reutilizar fragmentos que pueden incluir en numerosas páginas. Para ello disponemos de la directiva <@page include="fragmento.jsp">. l  De esta forma podemos hacer inclusiones de pies de página, encabezados, zonas laterales de menú, etc. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 115. Introducción l  De esta manera, cualquier operación de mantenimiento se podrá realizar en los fragmentos y por lo tanto serán propagados por todas las páginas afectadas. Pero esto a su vez conlleva un problema: ¿qué ocurre si se toma la decisión de modificar la ubicación en la página de uno de los elementos que hemos incluido mediante la directiva include?. No tenemos más remedio que modificar todas la páginas y cambiar el lugar donde se realiza el include. l  Para resolver este problema, debemos introducir un concepto nuevo ya utilizado en otras tecnologías para el diseño de interfaces de usuario, el de "template" o plantilla y que no existe en la especificación JSP de J2EE. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 116. Plantillas con Struts l  Las plantillas definen no sólo los elementos reutilizables si no la ubicación de los mismos. La idea consiste en especificar de manera única, el diseño o "layout" de un conjunto de páginas. Esta plantilla sería lo único que deberíamos cambiar en caso de querer modificar el diseño común de esa parte de la aplicación. l  En la plantilla se debe maquetar de manera que montaremos una composición con los distintos elementos dinámicos de la página. Las páginas concretas que se mostrarán, se limitarán a referenciar a una cierta plantilla y asignarán el contenido de las distintas piezas que usa la plantilla usada (cabecera, menú, pie y contenido). l  Las vistas, por lo tanto, se compondrán de dos partes: por un lado la plantilla propiamente dicha (layout) y por otro la página JSP que usará dicha plantilla, definiendo el contenido al que hacemos referencia cuando insertemos los distintos tiles. Ésta última será que será invocada por struts en el proceso de redirección del flujo de la petición. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 117. Composición de vistas con Struts Tiles l  Una vez comprendido el concepto de plantilla vamos a pasar a ver como definirlas mediante el uso de Struts Tiles. Afortunadamente no tenemos que aprender un nuevo lenguaje o tecnología para diseñar las plantillas, ya que éstas se definen en una JSP. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 118. Layout l  Echemos un vistazo al código donde hemos diseñado la plantilla principal (layoutVerUno.jsp). l  La base del código es fundamentalmente HTML, una tabla que en las distintas celdas tendrá ubicadas las porciones a modo de tiles (ladrillos). l  En primer lugar, usaremos la etiqueta <tiles:insert>, con ella daremos valor a las distintas variables que se definen en la plantilla. l  En el siguiente código veremos la forma que tendría la página layoutVerUno.jsp. Podemos observar la ubicación de las distintas porciones de la página. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 119. Layout l  layoutVerUno.jsp Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 120. Vista JSP l  Ahora sólo nos queda definir un JSP que haga uso en forma de plantilla de este 'layout'. En la especificación del 'layout' anterior, utilizamos la etiqueta <tiles:insert> para especificar un atributo que nos servirá para indicar ahora en la plantilla cómo insertar el diseño de cada zona. Esta página será la que será invocada en concepto de vista del caso de uso, en nuestro caso verUno.jsp, por lo que no habrá que modificar el contenido de struts-config.xml. l  En esta página se definen aquellas partes variables que serán referenciadas en la página "layout", por ejemplo header o copyright, y su correspondiente relación con las jsp que lo componen, en el caso anterior header.jsp y coyright.jsp. De la misma forma pueden aparecer referencias directas a variables, mensajes, títulos, etc.. que actuarán como si fueran pares de parámetros con su nombre y valor. l  Veamos el código de esta página prestando especial atención a la etiqueta page que indicará la plantilla a utilizar (layout). Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 121. Vista JSP l  Veamos el código de esta página prestando especial atención a la etiqueta page que indicará la plantilla a utilizar (layout). l  Es importante tener bien construidas las páginas de las que se compone la vista, ya que un error en alguna de ellas puede ser incómodo de detectar. Estas páginas actúan como fragmentos de jsp, por lo que no ser requiere su definición completa. Digamos que sustituyen a la directiva include u otros mecanismos nativos de jsp. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 122. Vista JSP l  Ejemplo de contenido, página contentVerUno.jsp Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 123. Resultado de la ejecución Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 124. Tema 9: Bibliotecas de etiquetas l  Tabla de contenidos ¡  ¡  ¡  ¡  ¡  ¡  Introducción Uso de una librería de etiquetas Biblioteca de etiquetas HTML Biblioteca de etiquetas BEAN Biblioteca de etiquetas LOGIC Ejemplo biblioteca LOGIC Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 125. Introducción l  El uso de las bibliotecas de etiquetas separa el código java de las páginas JSP. Esto nos permite crear páginas jsp que no contengan ni una sola línea de código java. La lógica es ejecutada por las etiquetas. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 126. Uso de una librería de etiquetas l  En los primeros ejemplos del manual, cuando hemos creado la página de entrada que contenía el formulario de registro, ya hemos utilizado las bibliotecas de etiquetas. Las librerías deben ser acompañadas de su correspondiente archivo tld (Tag Library Descriptor) y depende de la especificación de Servlets/Jsp que usemos podremos usar las etiquetas propias del Framework de una u otra forma. l  Recordamos los pasos que debemos seguir: Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 127. Uso de una librería de etiquetas l  1. Las bibliotecas de etiquetas y sus descriptores deben formar parte de nuestra aplicación: ¡  ¡  ¡  ¡  struts-bean.tld struts-html.tld struts-logic.tld ….. l  Los descriptores .tld encuentran en la carpeta lib del directorio de instalación de struts o están empaquetadas en los archivos .jar de librerías, depende de la distribución que se utilice. l  El código compilado de estas etiquetas se encuentra en el archivo struts.jar. No hemos de olvidar incorporar este archivo jar dentro del directorio lib de nuestro WEB-INF. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 128. Uso de una librería de etiquetas l  2. Mediante el uso de la directiva taglib, importamos las bibliotecas de etiquetas a la página jsp. Esto podemos hacerlo de dos maneras, dependiendo de la especificación de Servlets que usemos. A.  Referencia al tld (Tag Library Descriptor): usando la uri que referencia los archivos descriptores de etiquetas .tld. Esto se hará incluyendo la siguiente definición en el web.xml. Previamente las etiquetas deben estar ubicadas en un directorio bajo WEB-INF ¡  web.xml ¡  Referencia en nuestra página a la uri en cuestión Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 129. Uso de una librería de etiquetas B.  Usando especificación 2.3 de Servlet: si usamos la especificación de Sevlets 2.3, podemos obviar esta configuración (declaración en web.xml) para usar directamente la uri que corresponde a cada uno de los grupos de etiquetas personalizadas, delimitados por la definición de un .tld y cuya uri está definida en el mismo. ¡  Referencia directa en la JSP Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 130. Biblioteca de etiquetas HTML l  Se utiliza fundamentalmente para construir formularios de entrada de datos. Aunque también se utiliza para otras funciones como pueden ser: mostrar mensajes de error, proporcionar enlaces con reescritura de URL incluyendo el identificador de sesión, generar código de validación javascript, entre otras. l  En la siguiente tabla se muestran algunas de las más utilizadas: Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 131. Biblioteca de etiquetas HTML Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 132. Biblioteca de etiquetas BEAN l  Proporciona una serie de etiquetas para trabajar con javabeans. Se recogen en esta tabla los más comunes: Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 133. Biblioteca de etiquetas LOGIC l  Esta librería proporciona mecanismos para la presentación de datos al usuario. Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 134. Ejemplo biblioteca LOGIC l  Vamos a ver un ejemplo de utilización de esta última librería. l  1. Creamos un Action que introduzca una lista como atributo de la petición, con todos los artículos de la cesta. l  ConsultaAtculos.java Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 135. Ejemplo biblioteca LOGIC l  2. Configuramos la acción en el archivo struts-config.xml. Del siguiente modo: Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 136. Ejemplo biblioteca LOGIC l  3. Creamos una página jsp a la que nos dirige el forward exito. En esta página se utilizan las etiquetas de la biblioteca logic para iterar sobre la coleccion. ¡  Esta lista, si miras el código del punto anterior, se ha introducido como atributo de la petición. A este atributo hacemos referencia en la etiqueta <logic:present> para determinar si existe o no tal atributo. ¡  El código de la página jsp es el siguiente: Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 137. Ejemplo biblioteca LOGIC l  verTodos.jsp Javier Oliver Fulguera @javioliful www.oliverfulguera.es
  • 138. Ejemplo biblioteca LOGIC l  El resultado en ejecución: Javier Oliver Fulguera @javioliful www.oliverfulguera.es