sábado, 19 de diciembre de 2015

Formularios con Spring Tags

En el artículo anterior sobre Spring MVC vimos cómo procesar un formulario con etiquetas HTML, sin embargo Spring dispone de una librería de TAGS que podemos utilizar para crear vistas y enlazarlas con el modelo.

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

1 comentario:

  1. 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.
    Spring boot Online Training

    ResponderEliminar