Professional Documents
Culture Documents
FRAMEWORKS
Proveen una automatizacin de las tareas tpicas del dominio y una solucin de arquitectura. Son implementaciones de patrones de diseo, que facilitan la reutilizacin de diseo y cdigo.
FRAMEWORK STRUTS 2
No es tan slo una nueva versin del framework Struts 1. Es un nuevo framework basado en el framework OpenSymphony WebWork. Presenta una implementacin ms clara del patrn MVC. Introduce nuevos aspectos de arquitectura que hacen que el framework sea ms flexible:
Interceptores. Un
FRAMEWORK STRUTS 2
FRAMEWORK STRUTS 2
Actions
Encapsulan el trabajo a hacer para una peticin dada. Sirven como portadores de datos en la transferencia de la peticin a la vista. Ayudan a determinar qu resultado debe presentar la vista.
Interceptores
Las acciones tienen asociada una pila de interceptores. Son invocados antes y despus de la accin. Permiten definir varias tareas de flujo de trabajo y de propsito general:
Validacin
La ValueStack es un rea de almacenamiento que guarda todos los datos asociados al procesamiento de la peticin. OGNL es un lenguaje de expresiones que permite referenciar y manipular los datos de la ValueStack. Los datos de la ValueStack siguen el procesamiento de la peticin durante todas sus fases.
M del Pilar Prieto Linillos - SI3 8
ActionContext
Almacn que contiene todos los datos del contexto en el que ocurre una accin:
ValueStack. Mapas:
4.
Crear una clase JavaBean para almacenar el mensaje de bienvenida. (Modelo) Crear una JSP para presentar el mensaje. (Vista) Crear una clase Action para controlar la interaccin entre el usuario, el modelo y la vista. (Controlador) Crear un mapeador (struts.xml) para emparejar la clase Action y la vista.
M del Pilar Prieto Linillos - SI3 10
13
14
<s:url action="hola" var="holaLink"> <s:param name="nombreUsuario">Juan Fernndez</s:param> </s:url> <p><a href="${holaLink}">Hola Mundo</a></p>
16
Para permitir al framework Struts 2 trabajar con nuestra aplicacin web, necesitamos aadir una clase filtro servlet y un mapeador de filtro en web.xml:
3.
El navegador enva al servidor web una peticin para la URL http://localhost:8080/HolaMundo/hola.action. El contenedor recibe desde el servidor web una peticin para el recurso hola.action. Segn la configuracin indicada en web.xml, el contenedor encuentra que todas las peticiones son dirigidas al filtro StrutsPrepareAndExecuteFilter (punto de entrada al framework). El framework busca una accin mapeada llamada hola, y encuentra que se corresponde con la clase HolaMundoAction. El framework instancia la clase Action y llama a su mtodo execute.
18
5.
El mtodo execute crea un objeto AlmacenMensaje y devuelve SUCCESS. Basndose en el mapeo de la accin para el caso de devolver SUCCESS, el framework le indica al contenedor que presente como respuesta a la peticin el recurso holaMundo.jsp. Cuando la pgina holaMundo.jsp est siendo procesada, la etiqueta s:property llama al mtodo getAlmacenMensaje de la clase HolaMundoAction y luego al mtodo getMensaje del objeto almacenMensaje, y la etiqueta muestra como respuesta el valor del atributo mensaje. Una respuesta puramente HTML es enviada de vuelta al navegador.
6.
19
ACCIONES (ACTIONS)
Mapear una accin a una clase. Mapear un resultado a una vista. Escribir la lgica de control en la clase Action.
20
Clases Action
Actan como controlador dentro del patrn MVC. Responden a una accin de usuario, ejecutan lgica de negocio (o llaman a otras clases para que lo hagan) y devuelven un resultado que indica qu vista presentar. Normalmente extienden de la clase ActionSupport, que provee implementaciones por defecto para las acciones ms comunes (execute, input) e implementa varias interfaces tiles de Struts 2.
M del Pilar Prieto Linillos - SI3 21
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Hola Mundo</title> </head> <body> <h2>Mensaje con Struts 2:</h2> <p><a href="<s:url action='hola'/>">Hola Mundo</a></p> <p><a href="registro.jsp">Por favor regstrese.</a></p> </body> </html> 22 M del Pilar Prieto Linillos - SI3
<?xml version="1.0" encoding="ISO-8859-1" ?> <%@ taglib prefix="s" uri="/struts-tags" %> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> <title>Registro</title> </head> <body> <h3>Complete el formulario de registro.</h3> <s:form action="registro"> <s:textfield name="persona.nombre" label="Nombre" /> <s:textfield name="persona.apellido" label="Apellido" /> <s:textfield name="persona.email" label ="Email"/> <s:textfield name="persona.edad" label ="Edad"/> <s:submit/> </s:form> </body> 23 M del Pilar Prieto Linillos - SI3 </html>
24
25
26
Validar formularios
Para permitir que la clase Action valide las entradas introducidas por el usuario en el formulario, hay que definir el mtodo validate:
public void validate(){ if (persona.getNombre().length() == 0){ addFieldError("persona.nombre", "El nombre es obligatorio."); } if (persona.getApellido().length() == 0){ addFieldError("persona.apellido", "El apellido es obligatorio."); } if (persona.getEmail().length() == 0){ addFieldError("persona.email", "El email es obligatorio."); } if (persona.getEdad < 18){ addFieldError("persona.edad", "La edad es obligatoria y debe tener al menos 18 aos."); } }
Si hay algn error, Struts 2 no llamar al mtodo execute, sino que devolver input como resultado.
M del Pilar Prieto Linillos - SI3 27
Validar formularios
Validar formularios
29
Validar formularios
Para dar estilo a los mensajes de error, hay que aadir <s:head /> antes del cierre de </head>.
30
Para validar un formulario podemos utilizar un fichero XML con nombre nombreClaseAction-validation.xml:
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <validator type="requiredstring"> <param name="fieldname">persona.nombre</param> <message>El nombre es obligatorio.</message> </validator> <validator type="requiredstring"> <param name="fieldname">persona.email</param> <message>El email es obligatorio.</message> </validator> <validator type="email"> <param name="fieldname">persona.email</param> <message>El email no es vlido.</message> </validator> <validator type="int"> <param name="fieldName">persona.edad</param> <param name="min">18</param> <param name="max">120</param> <message>La edad debe ser entre ${min} y ${max} aos.</message> </validator> </validators> M del Pilar Prieto Linillos - SI3
31
Se puede asociar un fichero de propiedades con los recursos de mensajes a cada clase Action creando un fichero de propiedades con el mismo nombre que la clase Action y con la extensin .properties. Estos ficheros de propiedades deben estar en el mismo paquete que las clases Action. Creamos el fichero RegistroAction.properties:
persona.nombre=Nombre persona.apellido=Apellido persona.email=Email persona.edad=Edad submit=Enviar gracias=Gracias por registrarse %{persona.nombre}.
M del Pilar Prieto Linillos - SI3 32
El atributo key
El atributo key puede utilizarse en las etiquetas de los formularios para indicarle al framework qu valor utilizar para el nombre del campo y para el texto del campo. En vez de utilizar los atributos name y label, podemos utilizar slo el atributo key:
<s:textfield name="persona.nombre" label="Nombre" /> <s:textfield key="persona.nombre" />
33
El atributo key
Modificamos registro.jsp:
<?xml version="1.0" encoding="ISO-8859-1" ?> <%@ taglib prefix="s" uri="/struts-tags" %> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> <title>Registro</title> </head> <body> <h3>Complete el formulario de registro.</h3> <s:form action="registro"> <s:textfield key="persona.nombre" /> <s:textfield key="persona.apellido" /> <s:textfield key="persona.email" /> <s:textfield key="persona.edad" /> <s:submit key="submit" /> </s:form> </body> </html>
M del Pilar Prieto Linillos - SI3 34
El atributo key
Para que busque el texto en el fichero properties, la visualizacin de la pgina JSP debe ser el resultado de ejecutar una clase Action. Modificamos la pgina index.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Hola Mundo</title> </head> <body> <h2>Mensaje con Struts 2:</h2> <p><a href="<s:url action='hola'/>">Hola Mundo</a></p> <p><a href="<s:url action='entradaRegistro'/>">Por favor regstrese. </a></p> </body> </html>
M del Pilar Prieto Linillos - SI3 35
El atributo key
36
La etiqueta text
Tambin se puede utilizar la etiqueta text para mostrar textos de un fichero properties. En la pgina gracias.jsp podemos mostrar el mensaje de agradecimiento:
<h3><s:text name="gracias" /></h3>
%{persona.nombre} ser reemplazado por el resultado de llamar a getNombre del bean obtenido con el mtodo getPersona de la clase RegistroAction.
M del Pilar Prieto Linillos - SI3 37
Podemos crearnos un fichero de properties comn para todas las vistas mostradas a partir de todas las clases Action. De esta forma podremos tener literales de texto comunes a varias pginas. Por ejemplo, creamos un fichero global.properties y lo colocamos en el directorio src:
contacto=Para solicitar informacin contactar con <a href='mailto:contact@email.com'>contact@email.com</a>
38
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <constant name="struts.custom.i18n.resources" value="global" /> <package name="basicstruts2" extends="struts-default"> <action name="hola" class="action.HolaMundoAction" method="execute"> <result name="success">/holaMundo.jsp</result> </action> <action name="registro" class="action.RegistroAction" method="execute"> <result name="success">/gracias.jsp</result> <result name="input">/registro.jsp</result> </action> </package> </struts>
M del Pilar Prieto Linillos - SI3 39
Struts 2 primero buscar el literal en los ficheros properties correspondientes a la clase Action y despus en los globales.
40
Internacionalizacin
El uso de ficheros de recursos de mensajes tambin nos permite proveer texto en diferentes idiomas. Por defecto Struts 2 utilizar la localizacin por defecto del usuario. Por ejemplo, si es espaol, los ficheros de properties utilizados por defecto sern aqullos en los que no se especifica la localizacin (RegistroAction.properties). Si la localizacin es ingls, entonces Struts 2 buscar los archivos de properties terminados en _en (RegistroAction_en.properties):
persona.nombre=First name persona.apellido=Last name persona.email=Email persona.edad=Age submit=Submit gracias=Thank you for registering %{persona.nombre}.
M del Pilar Prieto Linillos - SI3 41
Internacionalizacin
Si queremos utilizar una localizacin distinta a la de por defecto, habr que indicarlo en la pgina. Aadimos en la pgina index.jsp:
<s:url action="entradaRegistro" var="entradaRegistroLinkEN"> <s:param name="request_locale">en</s:param> </s:url> <p></p><a href="${entradaRegistroLinkEN}">Please register.</a></p>
42
MANEJO DE EXCEPCIONES
Podemos especificar en struts.xml cmo actuar frente a excepciones no capturadas. Una excepcin especfica de accin tendr preferencia sobre una excepcin mapeada de forma global.
43
<global-exception-mappings> <exception-mapping exception="exceptions.SeguridadException" result="errorseguridad" /> <exception-mapping exception="java.lang.Exception" result="error" /> </global-exception-mappings> <global-results> <result name="securityerror">/errorseguridad.jsp</result> <result name="error">/error.jsp</result> </global-results>
M del Pilar Prieto Linillos - SI3 44
Si necesitamos manejar una excepcin de forma especfica para una cierta accin, aadimos una entrada exceptionmapping dentro de la entrada action.
<action name="accionconexcepcion" class="action.RegistroAction" method="lanzaSeguridadException"> <exception-mapping exception="exceptions.SeguridadException" result="login" /> <result>/registro.jsp</result> <result name="login">/login.jsp</result> </action>
M del Pilar Prieto Linillos - SI3 45
Etiqueta property:
Para
46
Etiquetas de datos
Etiqueta set:
Para
Tambin
Etiquetas de datos
Etiqueta bean:
Para
Tambin
<s:bean name="model.AlmacenMensaje"> <s:param name="mensaje" value="Hola" /> Mensaje: <s:property value="mensaje" /> </s:bean>
M del Pilar Prieto Linillos - SI3
48
Etiquetas de control
La etiqueta iterator puede iterar sobre un array, Collection, Map, Enumeration o Iterator.
<table> <s:iterator value="solicitudes" status="solicitudStatus" /> <tr class=" <s:if test="#solicitudStatus.odd==true" />impar</s:if> <s:else>par</s:else>"> <td><s:property value="nombre" /></td> <td><s:property value="fecha" /></td> </tr> </s:iterator> </table> 49 M del Pilar Prieto Linillos - SI3
Etiquetas de control
Para conocer ms sobre el estado del iterador podemos crear una instancia de IteratorStatus utilizando el atributo status de la etiqueta iterator.
Nombre index count first last even odd modulus Tipo devuelto int int boolean boolean boolean boolean int Descripcin El ndice (comenzando por 0) index + 1 true si es el primer elemento true si es el ltimo elemento true si count es un nmero par true si count es un nmero impar Devuelve el mdulo de count respecto a un nmero dado
50
Etiquetas de formulario
Etiqueta form:
<s:form action="registro">
Etiqueta textfield:
<s:textfield value="usuario.nombre" label="Usuario: "/> <s:textfield key="usuario.nombre" />
Etiqueta password:
<s:password key="usuario.password" />
51
Etiquetas de formulario
Etiqueta select:
<s:select key="persona.provincia" list="provincias" />
Si
queremos que los valores de los elementos de la lista sean distintos de los mostrados:
Etiqueta radio:
<s:radio key="persona.sexo" list="sexos" />
52 M del Pilar Prieto Linillos - SI3
Etiquetas de formulario
Etiqueta checkbox:
<s:checkbox key="persona.mayorEdad" />
Si
el checkbox est marcado, la propiedad asociada se cargar con el valor true. un checkbox no est marcado, un formulario HTML no enva ningn valor asociado al checkbox. Para que el campo asociado se cargue con el valor false cuando no se selecciona el checkbox, la etiqueta checkbox crea tambin un campo hidden.
Cuando
Etiqueta checkboxlist:
<s:checkboxlist key="persona.intereses" list="intereses" />
M del Pilar Prieto Linillos - SI3 53