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/