Monday, 29 October 2012

Spring MVC Form Validation (With Annotations)

This post provides a simple example of a HTML form validation. It is based on the Spring MVC With Annotations example. The code is available on GitHub in the Spring-MVC-Form-Validation directory.

Data

For this example we will use a bean and JSR303 validation annotations:
public class MyUser {

    @NotNull
    @Size(min=1,max=20)
    private String name;

    @Min(0)
    @Max(120)
    private int age;

    public MyUser(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public MyUser() {
        name = "";
        age = 0;
    }

    // Setters & Getters

}

Pages

Our form will contain input elements, but also the possibility to display error messages:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!doctype html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>My User Form!</title>
</head>
<body>
  <form:form method="post" action="myForm" commandName="myUser">
    <table>
      <tr>
        <td>Name: <font color="red"><form:errors path="name" /></font></td>
      </tr>
      <tr>
        <td><form:input path="name" /></td>
      </tr>
      <tr>
        <td>Age: <font color="red"><form:errors path="age" /></font></td>
      </tr>
      <tr>
        <td><form:input path="age" /></td>
      </tr>
      <tr>
        <td><input type="submit" value="Submit" /></td>
      </tr>
    </table>
  </form:form>
</body>
</html>
Our success page is:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!doctype html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>Form Processed Successfully!</title>
</head>
<body>
    Form processed for <c:out value="${myUser.name}" /> ! <br />
    <a href="<c:url value='/'/>">Home</a>
</body>
</html>
Our home page:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Welcome !!!</title>
</head>
<body>
  <h1>
    Spring Form Validation !!!
  </h1>
<a href="<c:url value='/myForm'/>">Go to the form!</a>
</body>
</html>

Controller

Notice that we need to use @ModelAttribute to make sure an instance of MyUser is always available in the model. In the validateForm(), we need to use @ModelAttribute to move the content of the form to the MyUser project.
@Controller
public class MyController {

    @RequestMapping(value = "/")
    public String home() {
        return "index";
    }

    @ModelAttribute("myUser")
    public MyUser getLoginForm() {
        return new MyUser();
    }

    @RequestMapping(value = "/myForm", method = RequestMethod.GET)
    public String showForm(Map model) {
        return "myForm";
    }

    @RequestMapping(value = "/myForm", method = RequestMethod.POST)
    public String validateForm(
        @ModelAttribute("myUser") @Valid MyUser myUser,
        BindingResult result, Map model) {

        if (result.hasErrors()) {
            return "myForm";
        }

        model.put("myUser", myUser);

        return "success";

    }

}

Maven Dependencies

We need the following dependencies. The Hibernate validator dependency is necessary to process JSR303 annotations:
<dependency>
  <groupId>javax.validation</groupId>
  <artifactId>validation-api</artifactId>
  <version>1.0.0.GA</version>
  <type>jar</type>
</dependency>

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>4.3.0.Final</version>
</dependency>

Running The Example

Once compiled, the example can be run with mvn tomcat:run. Then, browse:

  http://localhost:8383//spring-mvc-form-validation/.

If the end user enters invalid values, error messages will be displayed:


More Spring related posts here.