View
374
Download
5
Category
Preview:
Citation preview
STRUTS 2
Mª del Pilar Prieto Linillos - SI3 1
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
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
FRAMEWORK STRUTS 2
Implementa el patrón MVC:Modelo Action Vista Result Controlador FilterDispatcher
Mª del Pilar Prieto Linillos - SI3 4
FRAMEWORK STRUTS 2
Mª del Pilar Prieto Linillos - SI3 5
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
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
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
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
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
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
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
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 – 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
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
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
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
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
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
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
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
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
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
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 datosreturn 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 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
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
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
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
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
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
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
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 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
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
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
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: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 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Recommended