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