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>
<%@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>
<%@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.

A couple of extra controller methods mean you can reuse all validation annotations on the front end too:
ReplyDeletesee http://blog.springsource.org/2012/08/29/integrating-spring-mvc-with-jquery-for-validation-rules/