En este ejemplo vamos a ver cómo realizar un sencillo formulario mediante las etiquetas de Spring y recibirlas en el controlador.
El código completo del ejemplo esta disponible en mi repositorio de github.
En primer lugar es necesario definir la librería en la página JSP mediante:
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
El formulario jsp consta de una serie de campos, ten en cuenta que todavía no estamos validando los datos y si por ejemplo en el campo id instroduces un String generará un error.
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Tutorial Spring MVC</title>
</head>
<body>
<h1>Hello Spring MVC Forms!</h1>
<form:form modelAttribute="user" action="result" method="POST">
<form:label path="id">Id</form:label>
<form:input path="id" />
<form:label path="name">Name</form:label>
<form:input path="name" />
<form:label path="password">Password</form:label>
<form:input path="password" type="password"/>
<form:label path="email">Email</form:label>
<form:input path="email" />
<input type="submit" value="Enviar">
</form:form>
</body>
</html>
Hay 2 atributos principales en este formulario, el primero es modelAttribute, con el cual enlazamos nuestro modelo con la vista, es decir, es necesario tener una clase Usuario o User, y mediante el controlador pasar un objeto de esta clase a la vista mediante model.addAttribute("user", new User());. En este caso, se crea una instancia de User con new User() pero podríamos pasar un objeto User pre-cargado con valores y se mostrarían en a vista.
Si no pasamos el objeto user al jsp nos encontraremos con errores en nuestro JSP tipo:
"Neither BindingResult nor plain target object for bean name 'user' available as request attribute"
El segundo atributo es path, que hace referencia a las variables de la clase User.
Es posible encontrarse con el atributo commandName en vez de modelAttribute en algunos ejemplos o libros, y es la forma que se utilizaba en versiones anteriores a Spring 4.
Recibir los datos en el Controlador es tan simple como....
import net.codigoalonso.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class HomeController {
@RequestMapping(value = "/")
public String home(Model model) {
model.addAttribute("user", new User());
return "home";
}
@RequestMapping(value = "result", method = RequestMethod.POST)
public String Form(User user, Model model) {
model.addAttribute("user", user);
return "user";
}
}
Nota: en el caso de que el nombre de la variable user que recibe el método form, tenga distinto nombre que la definida en el formulario, debemos utilizar la anotación:
@ModelAttribute("user") User otroNombre
Observa, como el método home que es el que carga el formulario, carga un objeto user.
La mayor parte de los tags no tienen ningún misterio, pero a continuación os muestro algunos casos especiales.
Fechas en Formularios Spring.
Desde la versión 4 es posible utilizar el paquete de java.time disponible en Java 8 reemplazando a java.util.Date o joda-time.
Las etiqueta del formulario sería <form:input path="fecha" /> pero nuestra clase usuario necesita la anotación @DateTimeFormat, por ejemplo:
@DateTimeFormat(pattern="dd/MM/yyyy")
private LocalDate fecha
El atributo SELECT
Para utilizar el tag select lo podemos hacer de la siguiente forma:
<form:label path="country">Country</form:label>
<form:select path="country">
<form:options items="${countries}"></form:options>
</form:select>
Nuestro método home que muestra el formulario, necesita pasar el array o una colección con los datos cargados:
private static final String[] countries = { "Spain", "México", "Ecuador" };
model.addAttribute("countries",countries);
El código completo del ejemplo, donde hago uso de fechas y el campo select:
https://github.com/Jaime-Alonso/TutorialSpringMVC/tree/master/TutorialSpringMVC-04
Great post i must say and thanks for the information. Education is definitely a sticky subject. However, is still among the leading topics of our time. I appreciate your post and look forward to more.
ResponderEliminarSpring boot Online Training