53
STRUTS 2 Mª del Pilar Prieto Linillos - SI3 1

Struts 2

Embed Size (px)

Citation preview

Page 1: Struts 2

STRUTS 2

Mª del Pilar Prieto Linillos - SI3 1

Page 2: Struts 2

FRAMEWORKS

Proveen una automatización de las tareas típicas del dominio y una solución de arquitectura.

Son implementaciones de patrones de diseño, que facilitan la reutilización de diseño y código.

Mª del Pilar Prieto Linillos - SI3 2

Page 3: Struts 2

FRAMEWORK STRUTS 2 No es tan sólo una nueva versión del framework

Struts 1. Es un nuevo framework basado en el framework OpenSymphony WebWork.

Presenta una implementación más clara del patrón MVC.

Introduce nuevos aspectos de arquitectura que hacen que el framework sea más flexible: Interceptores. Un potente lenguaje de expresiones (OGNL). API de etiquetas.

Mª del Pilar Prieto Linillos - SI3 3

Page 4: Struts 2

FRAMEWORK STRUTS 2

Implementa el patrón MVC:Modelo Action Vista Result Controlador FilterDispatcher

Mª del Pilar Prieto Linillos - SI3 4

Page 5: Struts 2

FRAMEWORK STRUTS 2

Mª del Pilar Prieto Linillos - SI3 5

Page 6: Struts 2

Actions

Encapsulan el trabajo a hacer para una petición dada.

Sirven como portadores de datos en la transferencia de la petición a la vista.

Ayudan a determinar qué resultado debe presentar la vista.

Mª del Pilar Prieto Linillos - SI3 6

Page 7: Struts 2

Interceptores Las acciones tienen asociada una pila de

interceptores. Son invocados antes y después de la

acción. Permiten definir varias tareas de flujo de

trabajo y de propósito general:Validación de datos.Conversión de tipos.Logging.… Mª del Pilar Prieto Linillos - SI3 7

Page 8: Struts 2

ValueStack y OGNL (Object-Graph Navigation Language) La ValueStack es un área de almacenamiento

que guarda todos los datos asociados al procesamiento de la petición.

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 petición durante todas sus fases.

Mª del Pilar Prieto Linillos - SI3 8

Page 9: Struts 2

ActionContext

Almacén que contiene todos los datos del contexto en el que ocurre una acción:ValueStack.Mapas:

Petición (request). Sesión (session). Aplicación (application).

Asociado a hilo de ejecución.

Mª del Pilar Prieto Linillos - SI3 9

Page 10: Struts 2

CREAR UNA APLICACIÓN WEB BÁSICA Para crear un «Hola Mundo» necesitamos:

1. Crear una clase JavaBean para almacenar el mensaje de bienvenida. (Modelo)

2. Crear una JSP para presentar el mensaje. (Vista)

3. Crear una clase Action para controlar la interacción entre el usuario, el modelo y la vista. (Controlador)

4. Crear un mapeador (struts.xml) para emparejar la clase Action y la vista.

Mª del Pilar Prieto Linillos - SI3 10

Page 11: Struts 2

Paso 1 – Crear la clase modelo AlmacenMensaje.javapackage model;

public class AlmacenMensaje {

private String mensaje;

public AlmacenMensaje() {setMensaje("Hola Mundo");

}

public String getMensaje() {return mensaje;

}

public void setMensaje(String mensaje) {this.mensaje = mensaje;

}

} Mª del Pilar Prieto Linillos - SI3 11

Page 12: Struts 2

Paso 2 – Crear la clase Action HolaMundoAction.javapackage action;

import model.MessageStore;import com.opensymphony.xwork2.ActionSupport;

public class HolaMundoAction extends ActionSupport {

private AlmacenMensaje almacenMensaje;

public AlmacenMensaje getAlmacenMensaje() {return almacenMensaje;

}

public void setAlmacenMensaje(AlmacenMensaje almacenMensaje) {this.almacenMensaje = almacenMensaje;

}

public String execute() throws Exception {almacenMensaje = new AlmacenMensaje() ;return SUCCESS;

}

}Mª del Pilar Prieto Linillos - SI3 12

Page 13: Struts 2

Paso 3 – Crear la vista holaMundo.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><s:property value="almacenMensaje.mensaje"/></h2></body>

</html>

Mª del Pilar Prieto Linillos - SI3 13

Page 14: Struts 2

Paso 4 – Añadir la configuración de Struts en struts.xml<?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" />

<package name="basicstruts2" extends="struts-default">

<action name="hola" class="action.HolaMundoAction" method="execute"><result name="success">/holaMundo.jsp</result>

</action>

</package>

</struts>

Mª del Pilar Prieto Linillos - SI3 14

Page 15: Struts 2

Paso 5 – Crear la página index.jsp con la URL<%@ 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>

</body></html>

Mª del Pilar Prieto Linillos - SI3 15

Page 16: Struts 2

Paso 5 – Crear la página index.jsp con la URL Otra forma de utilizar la etiqueta s:url:

Si queremos pasar parámetros:

<s:url action="hola" var="holaLink" /><p><a href="${holaLink}">Hola Mundo</a></p>

<s:url action="hola" var="holaLink"><s:param name="nombreUsuario">Juan Fernández</s:param>

</s:url><p><a href="${holaLink}">Hola Mundo</a></p>

Mª del Pilar Prieto Linillos - SI3 16

Page 17: Struts 2

Paso 6 – Añadir el filtro de Struts 2 Para permitir al framework Struts 2 trabajar con nuestra

aplicación web, necesitamos añadir una clase filtro servlet y un mapeador de filtro en web.xml:

<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

</filter>

<filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern>

</filter-mapping>

Mª del Pilar Prieto Linillos - SI3 17

Page 18: Struts 2

Cómo funciona el código Cuando el usuario pulsa el enlace Hola Mundo:

1. El navegador envía al servidor web una petición para la URL http://localhost:8080/HolaMundo/hola.action.

2. El contenedor recibe desde el servidor web una petición para el recurso hola.action. Según la configuración indicada en web.xml, el contenedor encuentra que todas las peticiones son dirigidas al filtro StrutsPrepareAndExecuteFilter (punto de entrada al framework).

3. El framework busca una acción mapeada llamada hola, y encuentra que se corresponde con la clase HolaMundoAction. El framework instancia la clase Action y llama a su método execute.

Mª del Pilar Prieto Linillos - SI3 18

Page 19: Struts 2

Cómo funciona el código4. El método execute crea un objeto AlmacenMensaje y devuelve

SUCCESS. Basándose en el mapeo de la acción para el caso de devolver SUCCESS, el framework le indica al contenedor que presente como respuesta a la petición el recurso holaMundo.jsp.

5. Cuando la página holaMundo.jsp está siendo procesada, la etiqueta s:property llama al método getAlmacenMensaje de la clase HolaMundoAction y luego al método getMensaje del objeto almacenMensaje, y la etiqueta muestra como respuesta el valor del atributo mensaje.

6. Una respuesta puramente HTML es enviada de vuelta al navegador.

Mª del Pilar Prieto Linillos - SI3 19

Page 20: Struts 2

ACCIONES (ACTIONS)

Codificar una acción en Struts 2 conlleva:1. Mapear una acción a una clase.2. Mapear un resultado a una vista.3. Escribir la lógica de control en la clase

Action.

Mª del Pilar Prieto Linillos - SI3 20

Page 21: Struts 2

Clases Action Actúan como controlador dentro del patrón MVC. Responden a una acción de usuario, ejecutan

lógica 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 más comunes (execute, input…) e implementa varias interfaces útiles de Struts 2.

Mª del Pilar Prieto Linillos - SI3 21

Page 22: Struts 2

Procesar la entrada de un formulario en la clase Action Creamos en la página index.jsp un enlace a una página de registro:<%@ 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="registro.jsp">Por favor regístrese.</a></p>

</body></html> Mª del Pilar Prieto Linillos - SI3 22

Page 23: Struts 2

Procesar la entrada de un formulario en la clase Action El código de la página 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 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>

</html> Mª del Pilar Prieto Linillos - SI3 23

Page 24: Struts 2

Procesar la entrada de un formulario en la clase Action Creamos el JavaBean Persona:

package model;

public class Persona{private String nombre;private String apellido;private String email;private int edad;

public String getNombre(){return nombre;

}public void setNombre(String nombre){this.nombre = nombre;

}public String getApellido(){return apellido;

}public void setApellido(String l apellido astName){this.apellido = apellido;

}Mª del Pilar Prieto Linillos - SI3 24

Page 25: Struts 2

Procesar la entrada de un formulario en la clase Action

public String getEmail(){return email;

}public void setEmail(String email){this.email = email;

}public int getEdad(){return edad;

}public void setEdad(int edad){this.edad = edad;

}

public String toString(){return "Nombre: " + getNombre() + " Apellido: " + getApellido() + " Email: " + getEmail() + " Edad: " + getEdad();

}}

Mª del Pilar Prieto Linillos - SI3 25

Page 26: Struts 2

Procesar la entrada de un formulario en la clase Action Creamos la clase HolaMundoAction:

package action;

import model.Persona;import com.opensymphony.xwork2.ActionSupport;

public class RegistroAction extends ActionSupport {private Persona persona;

public Persona getPersona() {return persona;

}public void setPersona(Persona persona) {this.persona = persona;

}

public String execute() throws Exception {//Llamar a una clase de servicio que almacene el bean persona en //la base de datosreturn SUCCESS;

}} Mª del Pilar Prieto Linillos - SI3 26

Page 27: Struts 2

Validar formularios Para permitir que la clase Action valide las entradas introducidas por el

usuario en el formulario, hay que definir el método validate:

Si hay algún error, Struts 2 no llamará al método execute, sino que devolverá input como resultado.

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 almenos 18 años.");

}}

Mª del Pilar Prieto Linillos - SI3 27

Page 28: Struts 2

Validar formularios Añadimos el mapeo del resultado input de la acción en struts.xml:

<?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" /><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 28

Page 29: Struts 2

Validar formularios Si todo está correcto, se mostrará la página gracias.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 correcto</title>

</head><body><h3>Gracias por registrarse.</h3><p>Su información de registro: <s:property value="persona" /> </p>

</body></html>

Mª del Pilar Prieto Linillos - SI3 29

Page 30: Struts 2

Validar formularios Los mensajes se añaden automáticamente en la

vista indicada en input:

Para dar estilo a los mensajes de error, hay que añadir <s:head /> antes del cierre de </head>.

addFieldError("persona.nombre", "El nombre es obligatorio.");

Mª del Pilar Prieto Linillos - SI3 30

Page 31: Struts 2

Validación de formularios utilizando XML 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 válido.</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} años.</message>

</validator></validators>

Mª del Pilar Prieto Linillos - SI3 31

Page 32: Struts 2

FICHEROS DE RECURSOS DE MENSAJES 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 extensión .properties. Estos ficheros de propiedades deben estar en el mismo paquete que las clases Action.

Creamos el fichero RegistroAction.properties:persona.nombre=Nombrepersona.apellido=Apellidopersona.email=Emailpersona.edad=Edadsubmit=Enviargracias=Gracias por registrarse %{persona.nombre}.

Mª del Pilar Prieto Linillos - SI3 32

Page 33: Struts 2

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 sólo el atributo key:<s:textfield name="persona.nombre" label="Nombre" />

<s:textfield key="persona.nombre" />

Mª del Pilar Prieto Linillos - SI3 33

Page 34: Struts 2

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

Page 35: Struts 2

El atributo key Para que busque el texto en el fichero properties, la visualización de la

página JSP debe ser el resultado de ejecutar una clase Action. Modificamos la página 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 regístrese.</a></p>

</body></html>

Mª del Pilar Prieto Linillos - SI3 35

Page 36: Struts 2

El atributo key

Añadimos la acción entradaRegistro en struts.xml:

<action name="registerInput" class="action.RegistroAction" method="input"><result name="input">/registro.jsp</result>

</action>

Mª del Pilar Prieto Linillos - SI3 36

Page 37: Struts 2

La etiqueta text

También se puede utilizar la etiqueta text para mostrar textos de un fichero properties.

En la página gracias.jsp podemos mostrar el mensaje de agradecimiento:

%{persona.nombre} será reemplazado por el resultado de llamar a getNombre del bean obtenido con el método getPersona de la clase RegistroAction.

<h3><s:text name="gracias" /></h3>

Mª del Pilar Prieto Linillos - SI3 37

Page 38: Struts 2

Recursos de mensajes globales

Podemos crearnos un fichero de properties común para todas las vistas mostradas a partir de todas las clases Action. De esta forma podremos tener literales de texto comunes a varias páginas.

Por ejemplo, creamos un fichero global.properties y lo colocamos en el directorio src:contacto=Para solicitar información contactar con

<a href='mailto:[email protected]'>[email protected]</a>

Mª del Pilar Prieto Linillos - SI3 38

Page 39: Struts 2

Recursos de mensajes globales En el descriptor struts.xml hay que añadir una entrada

para indicarlo:<?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

Page 40: Struts 2

Recursos de mensajes globales Podemos mostrar el texto del literal contacto en

cualquier página añadiendo:

Struts 2 primero buscará el literal en los ficheros properties correspondientes a la clase Action y después en los globales.

<s:text name="contacto" />

Mª del Pilar Prieto Linillos - SI3 40

Page 41: Struts 2

Internacionalización El uso de ficheros de recursos de mensajes también nos permite

proveer texto en diferentes idiomas. Por defecto Struts 2 utilizará la localización por defecto del usuario. Por

ejemplo, si es español, los ficheros de properties utilizados por defecto serán aquéllos en los que no se especifica la localización (RegistroAction.properties).

Si la localización es inglés, entonces Struts 2 buscará los archivos de properties terminados en _en (RegistroAction_en.properties):

persona.nombre=First namepersona.apellido=Last namepersona.email=Emailpersona.edad=Agesubmit=Submitgracias=Thank you for registering %{persona.nombre}.

Mª del Pilar Prieto Linillos - SI3 41

Page 42: Struts 2

Internacionalización Si queremos utilizar una localización distinta a la

de por defecto, habrá que indicarlo en la página. Añadimos en la página index.jsp:

<s:url action="entradaRegistro" var="entradaRegistroLinkEN"><s:param name="request_locale">en</s:param>

</s:url><p></p><a href="${entradaRegistroLinkEN}">Pleaseregister.</a></p>

Mª del Pilar Prieto Linillos - SI3 42

Page 43: Struts 2

MANEJO DE EXCEPCIONES

Podemos especificar en struts.xmlcómo actuar frente a excepciones no capturadas.

Una excepción específica de acción tendrá preferencia sobre una excepción mapeada de forma global.

Mª del Pilar Prieto Linillos - SI3 43

Page 44: Struts 2

Manejo global de excepciones Debemos añadir dos entradas en struts.xml:

global-exception-mapping Indica qué hacer si una excepción no capturada del tipo especificado (o un hijo de ese tipo) es lanzada por la aplicación.

global-results Relaciona el resultado a una vista.

<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

Page 45: Struts 2

Manejo de excepciones por acción Si necesitamos manejar una excepción de

forma específica para una cierta acción, añadimos una entrada exception-mapping 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

Page 46: Struts 2

ETIQUETAS DE STRUTS 2Etiquetas de datos Etiqueta property:Para recuperar datos de la ValueStack o de

otro objeto del ActionContext.<s:property value="dato" /><s:property value="persona.nombre" />

Mª del Pilar Prieto Linillos - SI3 46

Page 47: Struts 2

Etiquetas de datos

Etiqueta set:Para asignar un valor de una propiedad a otro

nombre.Podemos almacenarlo en el ActionContext:

También podemos almacenarlo en el objeto session o en otro objeto del ActionContext:

<s:set name="nombrePersona" value="persona.nombre" /><s:property value="#nombrePersona" />

<s:set name="nombrePersona" value="persona.nombre"scope="session" /><s:property value="#session['nombrePersona']" />

Mª del Pilar Prieto Linillos - SI3 47

Page 48: Struts 2

Etiquetas de datos

Etiqueta bean:Para crear una instancia de un bean.Podemos crear una referencia en el ActionContext:

También podemos colocar el valor en la parte superior de la ValueStack:

<s:bean name="model.AlmacenMensaje" var="almacenMensaje" /><s:property value="#almacenMensaje.mensaje" />

<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

Page 49: Struts 2

Etiquetas de control

La etiqueta iterator puede iterar sobre un array, Collection, Map, Enumerationo Iterator.

<table><s:iterator value="solicitudes" status="solicitudStatus" /><trclass=" <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> Mª del Pilar Prieto Linillos - SI3 49

Page 50: Struts 2

Etiquetas de control

Para conocer más sobre el estado del iterador podemos crear una instancia de IteratorStatus utilizando el atributo statusde la etiqueta iterator.

Nombre Tipo devuelto Descripción

index int El índice (comenzando por 0)

count int index + 1

first boolean true si es el primer elemento

last boolean true si es el último elemento

even boolean true si count es un número par

odd boolean true si count es un número impar

modulus int Devuelve el módulo de count respecto a un número dado

Mª del Pilar Prieto Linillos - SI3 50

Page 51: Struts 2

Etiquetas de formulario

Etiqueta form:

Etiqueta textfield:

Etiqueta password:

<s:form action="registro">

<s:textfield value="usuario.nombre" label="Usuario: "/><s:textfield key="usuario.nombre" />

<s:password key="usuario.password" />

Mª del Pilar Prieto Linillos - SI3 51

Page 52: Struts 2

Etiquetas de formulario

Etiqueta select:

Si queremos que los valores de los elementos de la lista sean distintos de los mostrados:

Etiqueta radio:

<s:select key="persona.provincia" list="provincias" />

<s:select key="persona.provincia" list="provincias"listKey="codigo" listValue="nombre" />

<s:radio key="persona.sexo" list="sexos" />

Mª del Pilar Prieto Linillos - SI3 52

Page 53: Struts 2

Etiquetas de formulario Etiqueta checkbox:

Si el checkbox está marcado, la propiedad asociada se cargará con el valor true.

Cuando un checkbox no está marcado, un formulario HTML no envía ningún 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 también un campo hidden.

Etiqueta checkboxlist:

<s:checkbox key="persona.mayorEdad" />

<s:checkboxlist key="persona.intereses" list="intereses" />

Mª del Pilar Prieto Linillos - SI3 53