Implementando nuestro propio formulario de validación con Spring MVC.

0. Índice de contenidos.

1. Introducción

En este tutorial vamos a ver cómo implementar nuestro propio validador para los datos de un formulario con Spring MVC. Existen determinados casos en que las validaciones de los datos de un formulario son tan sencillas como validar que cierto campo sea obligatorio o que otro no pueda ser mayor de cierto valor. En este caso, podríamos solucionar el problema con anotaciones del tipo @NotNull o @Size en nuestro bean. Sin embargo, existen otras ocasiones en que las validaciones de unos datos pueden estar condicionadas por otros. En este caso, una buena solución podría ser definir nuestro propio validador para el formulario.

2. Entorno.

El tutorial está escrito usando el siguiente entorno:
  • Hardware: Portátil MacBook Pro 15′ (2.2 Ghz Intel Core I7, 4GB DDR3).
  • Sistema Operativo: Mac OS Snow Leopard 10.6.7
  • Entorno de desarrollo: Eclipse 3.6.2.
  • Apache Tomcat 6.0.32 con jdk 1.6.
  • Spring 3.1.0.
  • Navegador: Mozilla Firefox 4.0.1

3. Diseñar los datos del formulario.

Lo primero que debemos hacer es definir el bean en el que llegarán los datos al controlador directamente desde el cliente. En nuestro caso, el bean tendrá información relativa a un coche, en concreto: matrícula, modelo, año y kilómetros.

4. Implementar el validador concreto.

En este punto, estamos ya en disposición de poder implementar nuestro validador concreto. Las validaciones que realizaremos serán siguientes:
  • La matrícula es obligatoria.
  • La matrícula debe ser de la forma NNNN-LLL o L-NNNN-LL; donde L = letra y N = número.
  • El modelo es obligatorio.
  • El año no puede ser inferior a 1900 ni superior al año actual.
  • Si el año no es el actual, los kilómetros deben estar comprendidos entre 0 y 100.000.
No se si esto tiene mucho sentido en una aplicación empresarial, pero para nuestro ejemplo nos vale ;). El validador quedaría de la siguiente manera: El método rejectIfEmptyOrWhitespace de la clase ValidationUtils, será el encargado de añadir el error. En nuestro ejemplo recibe 4 parámetros: los errores, el nombre del campo que no pasó la validación, la clave del mensaje (internacionalización, properties…) y el mensaje por defecto. El método rejectValue de la clase Errors sirve para lo mismo.

5. El controlador.

A continuación, creamos el controlador. El método manejarFormularioYaValidado será el que reciba nuestro formulario con el resultado del proceso de validación. Al principio preguntamos si hubo errores con los datos del formulario y, en ese caso, redirigimos a la vista del formulario (vistaFormularioCoche.jsp). En caso de que todo haya salido correctamente ya se pueden manejar los datos, sabiendo que son correctos. Podríamos llamar a un Service que los tratara y redirigir a donde fuese. El método verFormulario únicamente nos redirecciona a la vista del formulario. Con el método initBinder estamos registrando el validador concreto que acabamos de implementar. El método populateForm nos suministra el objeto en el que se cargarán los datos del formulario, que posteriormente serán validados. En nuestro caso nos proporcionará un DatosCoche. El código sería este:

6. Crear la vista.

Por último nos faltaría crear la jsp vistaFormularioCoche.jsp donde se define el formulario con el que interactuará el usuario. Debemos prestar especial atención a los siguientes elementos:
  • form:form define el formulario que vamos a popular y validar. El valor de su atributo commandName debe coincidir con el de la anotación @ModelAttribute del método populateForm de nuestro controlador.
  • form:input define cada uno de los campos que vamos a cargar en nuestro DatosCoche. El atributo path hace referencia a la propiedad a cargar.
  • form:errors será el componente (un span de HTML) donde aparecerá el error relacionado con el campo (path) que lleve definido. El atributo cssClass referencia al la regla de estilo css que le queramos dar.
La jsp vistaFormularioCoche.jsp quedaría de la siguiente forma: El formulario se vería de la siguiente forma: Introduciendo datos incorrectos nos mostraría lo siguiente:

7. Referencias.

8. Conclusiones.

Hemos visto que es relativamente sencillo implementar nuestro propio validador utilizando Spring MVC. El validador concreto nos aportará más control que otro sistema de validación a modo de anotaciones, sin embargo, con éste último no tendremos que implementar nada, por lo que puede que si las validaciones que vamos a realizar a los campos de nuestro formulario son constantes y sencillas, tengamos que pensar en esta segunda opción como más adecuada. Espero que este tutorial os haya sido de ayuda. Un saludo. Miguel Arlandy marlandy@autentia.com