Spring define sus propias librerías de tags de forma similar a las ofrecidas por JSTL. Pero como de costumbre su utilización es opcional, no se exige su uso.
Dependencias
Para los ejemplos de esta parte se utilizará JSTL, por lo que es necesario incluir la correspondiente dependencia en el fichero pom.xml de Maven:
<dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
Tag Library
Spring define actualmente dos librerías de tags. La primera es de uso general, para el manejo de error, soporte para themes, internacionalización y binding, principalmente:
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
La segunda es más específica para la gestión de formularios:
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
spring:message
Este tag proporciona el texto de un mensaje a partir de su código, resuelto en base a la configuración de internacionalización:
<spring:message code='saludo'/>
form:form
Este tag contiene a todos los demás tags de formularios, ofreciendo sobre todo facilidades para el binding.
Consideremos por ejemplo la siguiente clase POJO:
public class Cliente { private String nombre; private String apellidos; ...
Un manejador puede devolver un objeto de este tipo en el modelo:
public ModelAndView handler() { ModelAndView mv = new ModelAndView("formulario"); Cliente cliente = new Cliente(); cliente.setNombre("Cristobal"); cliente.setApellidos("Colon"); mv.addObject("cliente", cliente); return mv; }
De forma que la página JSP correspondiente puede utilizarlo directamente:
<form:form modelAttribute="cliente" action="doIt" method="post"> <div> Nombre: <form:input path="nombre"/> <br/> Apellidos: <form:input path="apellidos"/> </div> <input type="submit" value="Enviar"/> </form:form>
El atributo modelAttribute
establece el nombre del objeto dentro del modelo que contiene los datos en proceso. Por defecto su valor es «command» por compatibilidad con JSP, y de hecho, este valor también se puede cambiar utilizando commandName
.
Los atributos de tipo path
permiten indicar una propiedad dentro del objeto. De forma que path="nombre"
se resuelve como cliente.getNombre()
.
Cuando se pulse al botón de enviar, el manejador correspondiente a esa parte recibe un objeto de la clase adecuada:
@RequestMapping(value="/doIt", method=RequestMethod.POST) public String handler(Cliente cliente) { ...
Controles
Dentro del tag de formulario se pueden incluir los siguientes controles:
– form:checkbox
– form:checkboxes
– form:radiobutton
– form:radiobuttons
– form:password
– form:select
– form:option
– form:options
– form:textarea
– form:hidden
– form:errors
Todos son equivalentes a sus controles homónimos en HTML, pero con las capacidades de binding añadidas a través del atributo path
. Además, los controles que tienen el nombre en plural admiten un atributo items
que facilita renderizar directamente los valores de una colección:
<form:select path="aficiones" items="${aficiones}"/>