You are on page 1of 53

STRUTS 2

M del Pilar Prieto Linillos - SI3

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.

M del Pilar Prieto Linillos - SI3

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

potente lenguaje de expresiones (OGNL). API de etiquetas.


M del Pilar Prieto Linillos - SI3 3

FRAMEWORK STRUTS 2

Implementa el patrn MVC:


Action Vista Result Controlador FilterDispatcher
Modelo

M del Pilar Prieto Linillos - SI3

FRAMEWORK STRUTS 2

M del Pilar Prieto Linillos - SI3

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.

M del Pilar Prieto Linillos - SI3

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

de datos. Conversin de tipos. Logging. M del Pilar Prieto Linillos - SI3

ValueStack y OGNL (ObjectGraph Navigation Language)

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:

Peticin (request). Sesin (session). Aplicacin (application).

Asociado a hilo de ejecucin.


M del Pilar Prieto Linillos - SI3 9

CREAR UNA APLICACIN WEB BSICA

Para crear un Hola Mundo necesitamos:


1. 2. 3.

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

Paso 1 Crear la clase modelo AlmacenMensaje.java


package 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

Paso 2 Crear la clase Action HolaMundoAction.java


package 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

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

Paso 4 Aadir la configuracin 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

Paso 5 Crear la pgina 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

Paso 5 Crear la pgina index.jsp con la URL

Otra forma de utilizar la etiqueta s:url:

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

Si queremos pasar parmetros:

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

M del Pilar Prieto Linillos - SI3

16

Paso 6 Aadir el filtro de Struts 2

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:

<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

Cmo funciona el cdigo

Cuando el usuario pulsa el enlace Hola Mundo:


1. 2.

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.

M del Pilar Prieto Linillos - SI3

18

Cmo funciona el cdigo


4.

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.

M del Pilar Prieto Linillos - SI3

19

ACCIONES (ACTIONS)

Codificar una accin en Struts 2 conlleva:


1. 2. 3.

Mapear una accin a una clase. Mapear un resultado a una vista. Escribir la lgica de control en la clase Action.

M del Pilar Prieto Linillos - SI3

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

Procesar la entrada de un formulario en la clase Action

Creamos en la pgina index.jsp un enlace a una pgina 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=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

Procesar la entrada de un formulario en la clase Action El cdigo de la pgina 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> 23 M del Pilar Prieto Linillos - SI3 </html>

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

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

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 datos return SUCCESS; } }
M del Pilar Prieto Linillos - SI3

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

Aadimos el mapeo del resultado input de la accin 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

Validar formularios

Si todo est correcto, se mostrar la pgina 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 informacin de registro: <s:property value="persona" /> </p> </body> </html>

M del Pilar Prieto Linillos - SI3

29

Validar formularios

Los mensajes se aaden automticamente en la vista indicada en input:


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

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

M del Pilar Prieto Linillos - SI3

30

Validacin 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 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

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

M del Pilar Prieto Linillos - SI3

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

Aadimos la accin 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

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

Recursos de mensajes globales

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>

M del Pilar Prieto Linillos - SI3

38

Recursos de mensajes globales

En el descriptor struts.xml hay que aadir 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

Recursos de mensajes globales

Podemos mostrar el texto del literal contacto en cualquier pgina aadiendo:


<s:text name="contacto" />

Struts 2 primero buscar el literal en los ficheros properties correspondientes a la clase Action y despus en los globales.

M del Pilar Prieto Linillos - SI3

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>

M del Pilar Prieto Linillos - SI3

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.

M del Pilar Prieto Linillos - SI3

43

Manejo global de excepciones

Debemos aadir dos entradas en struts.xml:


Indica qu hacer si una excepcin no capturada del tipo especificado (o un hijo de ese tipo) es lanzada por la aplicacin. global-results Relaciona el resultado a una vista.
global-exception-mapping

<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

Manejo de excepciones por accin

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

ETIQUETAS DE STRUTS 2 Etiquetas 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

Etiquetas de datos

Etiqueta set:
Para

asignar un valor de una propiedad a otro nombre. Podemos almacenarlo en el ActionContext:


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

Tambin

podemos almacenarlo en el objeto session o en otro objeto del ActionContext:

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


M del Pilar Prieto Linillos - SI3 47

Etiquetas de datos

Etiqueta bean:
Para

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


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

Tambin

podemos colocar el valor en la parte superior de la ValueStack:

<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

M del Pilar Prieto Linillos - SI3

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

M del Pilar Prieto Linillos - SI3

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:

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

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

You might also like