Explorando la biblioteca de etiquetas de formulario de SpringMVC

1. Información general

En el primer artículo de esta serie, presentamos el uso de la biblioteca de etiquetas de formulario y cómo vincular datos a un controlador.

En este artículo, cubriremos las diversas etiquetas que proporciona Spring MVC para ayudarnos a crear y validar formularios .

2. La etiqueta de entrada

Empezaremos con la etiqueta de entrada . Esta etiqueta representa una etiqueta de entrada HTML utilizando el valor enlazado y el tipo = 'texto' de forma predeterminada:

A partir de Spring 3.1, puede usar otros tipos específicos de HTML5, como correo electrónico, fecha y otros. Por ejemplo, si quisiéramos crear un campo de correo electrónico, podemos usar type = 'email':

De manera similar, para crear un campo de fecha, podemos usar type = 'date' , que generará un selector de fecha en muchos navegadores compatibles con HTML5:

3. La etiqueta de contraseña

Esta etiqueta representa una etiqueta de entrada HTML con type = 'contraseña' usando el valor enlazado. Esta entrada HTML enmascara el valor escrito en el campo:

4. La etiqueta textarea

Esta etiqueta muestra un área de texto HTML :

Podemos especificar el número de filas y columnas de la misma manera que lo haríamos con un área de texto HTML .

5. La casilla de verificación y las casillas de verificación Etiqueta

La etiqueta de casilla de verificación muestra una etiqueta de entrada HTML con type = 'checkbox' . La biblioteca de etiquetas de formulario de Spring MVC proporciona diferentes enfoques para la etiqueta de casilla de verificación que debería satisfacer todas nuestras necesidades de casilla de verificación :

El ejemplo anterior genera una casilla de verificación única clásica , con un valor booleano . Si establecemos el valor enlazado en verdadero , esta casilla de verificación se marcará de forma predeterminada.

El siguiente ejemplo genera varias casillas de verificación . En este caso, los valores de la casilla de verificación están codificados dentro de la página JSP:

Bird watching:  Astronomy:  Snowboarding: 

Aquí, el valor enlazado es de tipo array o java.util.Collection :

String[] hobbies;

El propósito de la etiqueta checkboxes se usa para representar múltiples casillas de verificación, donde los valores de las casillas de verificación se generan en tiempo de ejecución:

Para generar los valores pasamos una matriz , una lista o un mapa que contiene las opciones disponibles en la propiedad de los elementos . Podemos inicializar nuestros valores dentro del controlador:

List favouriteLanguageItem = new ArrayList(); favouriteLanguageItem.add("Java"); favouriteLanguageItem.add("C++"); favouriteLanguageItem.add("Perl");

Normalmente, la propiedad vinculada es una colección, por lo que puede contener varios valores seleccionados por el usuario:

List favouriteLanguage;

6. La etiqueta de radiobutton y radiobuttons

Esta etiqueta muestra una etiqueta de entrada HTML con type = 'radio':

Male:  Female: 

Un patrón de uso típico implicará varias instancias de etiquetas con diferentes valores vinculados a la misma propiedad:

private String sex;

Al igual que la etiqueta de casillas de verificación , la etiqueta de botones de radio representa varias etiquetas de entrada HTML con type = 'radio' :

En este caso, es posible que deseemos pasar las opciones disponibles como una matriz , una lista o un mapa que contiene las opciones disponibles en la propiedad de elementos :

List jobItem = new ArrayList(); jobItem.add("Full time"); jobItem.add("Part time");

7. La etiqueta de selección

Esta etiqueta representa un elemento de selección HTML :

Para generar los valores pasamos una matriz , una lista o un mapa que contiene las opciones disponibles en la propiedad de los elementos . Una vez más, podemos inicializar nuestros valores dentro del controlador:

Map countryItems = new LinkedHashMap(); countryItems.put("US", "United States"); countryItems.put("IT", "Italy"); countryItems.put("UK", "United Kingdom"); countryItems.put("FR", "France");

La etiqueta de selección también admite el uso de opciones anidadas y etiquetas de opciones .

Mientras que la etiqueta de opción representa una sola opción HTML , la etiqueta de opciones representa una lista de etiquetas de opción HTML .

La etiqueta de opciones toma una matriz , una lista o un mapa que contiene las opciones disponibles en la propiedad de los elementos , al igual que la etiqueta de selección :

Cuando tenemos la necesidad de seleccionar varios elementos a la vez, podemos crear un cuadro de lista múltiple. Para representar este tipo de lista, simplemente agregue el atributo multiple = "true" en la etiqueta de selección .

Aquí, la propiedad vinculada es una matriz o un java.util.Collection :

List fruit;

8. La etiqueta oculta

Esta etiqueta muestra una etiqueta de entrada HTML con type = 'hidden' usando el valor enlazado:

9. La etiqueta de errores

Los validadores asociados con el controlador generan mensajes de error de campo. Podemos usar la etiqueta de errores para representar esos mensajes de error de campo:

Esto mostrará errores para el campo especificado en la propiedad de ruta . Los mensajes de error se representan dentro de una etiqueta de intervalo de forma predeterminada, con .errors anexados al valor de la ruta como id , y opcionalmente una clase CSS de la propiedad cssClass , que se puede usar para diseñar la salida:

Name is required!

Para incluir los mensajes de error con un elemento diferente en lugar de la etiqueta span predeterminada , podemos especificar el elemento preferido dentro del atributo del elemento :

Esto muestra los mensajes de error dentro de un elemento div :

 Name is required! 

Además de tener la capacidad de mostrar errores para un elemento de entrada específico, podemos mostrar la lista completa de errores (independientemente del campo) para una página determinada. Esto se logra mediante el uso del comodín * :

9.1. El Validador

Para mostrar errores para un campo dado, necesitamos definir un validador:

public class PersonValidator implements Validator { @Override public boolean supports(Class clazz) { return Person.class.isAssignableFrom(clazz); } @Override public void validate(Object obj, Errors errors) { ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "required.name"); } }

En este caso, si el nombre del campo está vacío, el validador devuelve el mensaje de error identificado por required.name del paquete de recursos.

El paquete de recursos se define en el archivo de configuración Spring XML de la siguiente manera:

O en un estilo de configuración de Java puro:

@Bean public MessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasenames("messages"); return messageSource; }

El mensaje de error se define dentro del archivo messages.properties :

required.name = Name is required!

To apply this validation, we need to include a reference to the validator in our controller and call the method validate in the controller method which is called when user submits the form:

@RequestMapping(value = "/addPerson", method = RequestMethod.POST) public String submit( @ModelAttribute("person") Person person, BindingResult result, ModelMap modelMap) { validator.validate(person, result); if (result.hasErrors()) { return "personForm"; } modelMap.addAttribute("person", person); return "personView"; }

9.2. JSR 303 Bean Validation

Starting from Spring 3, we can use JSR 303 (via the @Valid annotation) for bean validation. To do this we need a JSR303 validator framework on the classpath. We will use the Hibernate Validator (the reference implementation). Following is the dependency that we need to include in the POM:

 org.hibernate hibernate-validator 5.1.1.Final 

To make Spring MVC support JSR 303 validation via the @Valid annotation, we need to enable the following in our Spring configuration file:

Or use the corresponding annotation @EnableWebMvc in a Java configuration:

@EnableWebMvc @Configuration public class ClientWebConfigJava implements WebMvcConfigurer { // All web configuration will go here }

Next, we need to annotate the controller method that we want to validate with the @Valid annotation:

@RequestMapping(value = "/addPerson", method = RequestMethod.POST) public String submit( @Valid @ModelAttribute("person") Person person, BindingResult result, ModelMap modelMap) { if(result.hasErrors()) { return "personForm"; } modelMap.addAttribute("person", person); return "personView"; }

Now we can annotate the entity's property to validate it with Hibernate validator annotation:

@NotEmpty private String password;

By default, this annotation will display “may not be empty” if we leave the password input field empty.

We can override the default error message by creating a property in the resource bundle defined in the validator example. The key of the message follows the rule AnnotationName.entity.fieldname:

NotEmpty.person.password = Password is required!

10. Conclusion

In this tutorial we explored the various tags that Spring provides for working with forms.

También echamos un vistazo a la etiqueta para mostrar el error de validación y la configuración necesaria para mostrar mensajes de error personalizados.

Todos los ejemplos anteriores se pueden encontrar en un proyecto de GitHub. Este es un proyecto basado en Eclipse, por lo que debería ser fácil de importar y ejecutar tal como está.

Cuando el proyecto se ejecuta localmente, se puede acceder al ejemplo de formulario en:

// localhost: 8080 / spring-mvc-xml / persona