1. Información general
En este artículo, analizaremos los formularios Spring y la vinculación de datos a un controlador. Además, veremos una de las anotaciones principales en Spring MVC, es decir, @ModelAttribute .
Por supuesto, Spring MVC es un tema complejo con muchas cosas que necesita comprender para usarlo en todo su potencial, así que definitivamente profundice en el marco aquí.
2. El modelo
Primero, definamos una entidad simple que vamos a mostrar y vincular al formulario:
public class Employee { private String name; private long id; private String contactNumber; // standard getters and setters }
Este será nuestro objeto de respaldo de formulario.
3. La vista
A continuación, definamos el formulario real y, por supuesto, el archivo HTML que lo contiene. Vamos a utilizar una página donde se crea / registra un nuevo empleado:
Welcome, Enter The Employee Details
Name
Id
Contact Number
Primero, observe que estamos incluyendo una biblioteca de etiquetas en nuestra página JSP, el formulario taglib, para ayudar a definir nuestro formulario.
Siguiente - el la etiqueta juega un papel importante aquí; es muy similar al HTLM normalpero el atributo modelAttribute es la clave que especifica un nombre del objeto modelo que respalda este formulario:
Esto corresponderá al @ModelAttribute más adelante en el controlador.
A continuación, cada campo de entrada utiliza otra etiqueta útil del Spring Form taglib - form: prefix . Cada uno de estos campos especifica un atributo de ruta ; este debe corresponder a un captador / definidor del atributo del modelo (en este caso, la clase Empleado). Cuando se carga la página, los campos de entrada se rellenan con Spring, que llama al captador de cada campo vinculado a un campo de entrada. Cuando se envía el formulario, se llama a los establecedores para guardar los valores del formulario en el objeto.
Finalmente, cuando se envía el formulario , se invoca el controlador POST en el controlador y el formulario se vincula automáticamente al argumento de empleado que pasamos.
4. El controlador
Ahora, veamos el controlador que se encargará del back-end:
@Controller public class EmployeeController { @RequestMapping(value = "/employee", method = RequestMethod.GET) public ModelAndView showForm() { return new ModelAndView("employeeHome", "employee", new Employee()); } @RequestMapping(value = "/addEmployee", method = RequestMethod.POST) public String submit(@Valid @ModelAttribute("employee")Employee employee, BindingResult result, ModelMap model) { if (result.hasErrors()) { return "error"; } model.addAttribute("name", employee.getName()); model.addAttribute("contactNumber", employee.getContactNumber()); model.addAttribute("id", employee.getId()); return "employeeView"; } }
El controlador define dos operaciones simples: GET para mostrar datos en el formulario y POST para la operación de creación, a través del envío del formulario.
También tenga en cuenta que si el objeto llamado "empleado" no se agrega al modelo, Spring se quejará cuando intentemos acceder a la JSP porque la JSP se configurará para vincular el formulario al atributo del modelo "empleado":
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'employee' available as request attribute at o.s.w.s.s.BindStatus.(BindStatus.java:141)
Para acceder a nuestro objeto de respaldo de formulario, necesitamos inyectarlo a través de la anotación @ModelAttribute .
Un @ModelAttribute
argumento sobre un método indica que el argumento se recuperará del modelo. Si no está presente en el modelo, el argumento se instanciará primero y luego se agregará al modelo.
5. Manejo de errores de vinculación
De forma predeterminada, Spring MVC lanza una excepción cuando ocurren errores durante el enlace de la solicitud. Por lo general, esto no es lo que queremos, en cambio, deberíamos presentar estos errores al usuario. Vamos a usar un BindingResult agregando uno como argumento a nuestro método de controlador:
public String submit( @Valid @ModelAttribute("employee") Employee employee, BindingResult result, ModelMap model)
El argumento BindingResult debe colocarse justo después de nuestro objeto de respaldo de formulario; es uno de los raros casos en los que el orden de los argumentos del método es importante. De lo contrario, nos encontraremos con la siguiente excepción:
java.lang.IllegalStateException: Errors/BindingResult argument declared without preceding model attribute. Check your handler method signature!
Ahora, ya no se lanza una excepción; en su lugar, los errores se registrarán en el BindingResult que se pasa al método de envío . En este punto, podemos manejar estos errores de varias formas; por ejemplo, la operación se puede cancelar:
@RequestMapping(value = "/addEmployee", method = RequestMethod.POST) public String submit(@Valid @ModelAttribute("employee")Employee employee, BindingResult result, ModelMap model) { if (result.hasErrors()) { return "error"; } //Do Something return "employeeView"; }
Observe cómo, en caso de que el resultado contenga errores, le devolvemos otra vista al usuario para mostrar estos errores correctamente. Echemos un vistazo a esa vista: error.jsp :
Please enter the correct details
Retry
6. Visualización de un empleado
Finalmente, además de crear un nuevo empleado, también podemos simplemente mostrar uno; aquí está el código de vista rápida para eso:
Submitted Employee Information
Name :
${name}
ID :
${id}
Contact Number :
${contactNumber}
La página JSP simplemente usa expresiones EL para mostrar valores de propiedades del objeto Empleado en el modelo.
7. Prueba de la aplicación
La aplicación simple se puede implementar, por ejemplo, en un servidor Tomcat, y se puede acceder a ella localmente:
// localhost: 8080 / spring-mvc-xml / employee
Esta es la vista que contiene el formulario principal, antes de la operación de envío:

Ejemplo de formulario Spring MVC - Enviar
Después del envío, se muestran los datos:

Ejemplo de formulario Spring MVC - Ver
Y eso es todo: un ejemplo funcional de un formulario simple con Spring MVC, con validación .
La implementación de este tutorial de Spring MVC se puede encontrar en el proyecto GitHub; este es un proyecto basado en Maven, por lo que debería ser fácil de importar y ejecutar tal como está.
Finalmente, como decía al principio del artículo, definitivamente deberías profundizar en Spring MVC.