Spring MVC Validator @InitBinder and WebDataBinder;Validator是一个用来我们自定义验证的sping接口,WebDataBinder 绑定你的自定义参数,你直接在你的控制器类中通过@InitBinder 注解的方式配置 Web 数据绑定.registerCustomEditor()是一个属性编辑器,比如自定义的日期编辑它绑定web请求参数到JavaBean的属性;
下面一个例子,我们创建一个JavaBean(username, password, email and date of birth of a user),我们创建两个自定义的验证类.第一个,我们验证用户名和密码.第二个,验证邮箱,
在Eclipse中Demo的结构

Validator 是一个有两个方法的接口;
boolean supports(Class<?> clazz) : 检验参数是否验证成功的实例类;
void validate(Object target, Errors errors) : 如果 supports() 方法返回真, target object 合法. Errors.rejectValue() 方法用一个字段名注册错误信息;
Uservalidator.java

1 package com.concretepage.validators; 2 import org.springframework.stereotype.Component; 3 import org.springframework.validation.Errors; 4 import org.springframework.validation.ValidationUtils; 5 import org.springframework.validation.Validator; 6 import com.concretepage.User; 7 @Component 8 public class UserValidator implements Validator { 9 @Override 10 public boolean supports(Class<?> clazz) { 11 return User.class.isAssignableFrom(clazz); 12 } 13 @Override 14 public void validate(Object target, Errors errors) { 15 User user = (User)target; 16 ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "","Username is empty"); 17 ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "", "Password is empty"); 18 if (user.getName().length()<5) { 19 errors.rejectValue("name","", "Username length is less than 5"); 20 } 21 } 22 }
EmailValidator.java

1 package com.concretepage.validators; 2 import org.springframework.stereotype.Component; 3 import org.springframework.validation.Errors; 4 import org.springframework.validation.ValidationUtils; 5 import org.springframework.validation.Validator; 6 import com.concretepage.User; 7 @Component 8 public class EmailValidator implements Validator { 9 @Override 10 public boolean supports(Class<?> clazz) { 11 return User.class.isAssignableFrom(clazz); 12 } 13 @Override 14 public void validate(Object target, Errors errors) { 15 User user = (User)target; 16 ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "","Email is empty"); 17 if (!user.getEmail().contains("@")) { 18 errors.rejectValue("email","", "Email is not valid."); 19 } 20 } 21 }
User.java

1 package com.concretepage;
2 import java.util.Date;
3 public class User {
4 private String name;
5 private String password;
6 private String email;
7 private Date dob;
8 public String getName() {
9 return name;
10 }
11 public void setName(String name) {
12 this.name = name;
13 }
14 public String getPassword() {
15 return password;
16 }
17 public void setPassword(String password) {
18 this.password = password;
19 }
20 public String getEmail() {
21 return email;
22 }
23 public void setEmail(String email) {
24 this.email = email;
25 }
26 public Date getDob() {
27 return dob;
28 }
29 public void setDob(Date dob) {
30 this.dob = dob;
31 }
32 }
MyWorldController

1 package com.concretepage; 2 import java.text.SimpleDateFormat; 3 import java.util.Date; 4 5 import javax.validation.Valid; 6 7 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.beans.propertyeditors.CustomDateEditor; 9 import org.springframework.stereotype.Controller; 10 import org.springframework.ui.ModelMap; 11 import org.springframework.validation.BindingResult; 12 import org.springframework.web.bind.WebDataBinder; 13 import org.springframework.web.bind.annotation.InitBinder; 14 import org.springframework.web.bind.annotation.ModelAttribute; 15 import org.springframework.web.bind.annotation.RequestMapping; 16 import org.springframework.web.bind.annotation.RequestMethod; 17 import org.springframework.web.servlet.ModelAndView; 18 19 import com.concretepage.validators.EmailValidator; 20 import com.concretepage.validators.UserValidator; 21 @Controller 22 @RequestMapping("/myworld") 23 public class MyWorldController { 24 @Autowired 25 private UserValidator userValidator; 26 @Autowired 27 private EmailValidator emailValidator; 28 29 @RequestMapping(value="signup", method = RequestMethod.GET) 30 public ModelAndView user(){ 31 return new ModelAndView("user","user",new User()); 32 } 33 @InitBinder 34 public void dataBinding(WebDataBinder binder) { 35 binder.addValidators(userValidator, emailValidator); 36 SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); 37 dateFormat.setLenient(false); 38 binder.registerCustomEditor(Date.class, "dob", new CustomDateEditor(dateFormat, true)); 39 } 40 41 @RequestMapping(value="save", method = RequestMethod.POST) 42 public String createUser(@ModelAttribute("user") @Valid User user,BindingResult result, ModelMap model) { 43 if(result.hasErrors()) { 44 return "user"; 45 } 46 System.out.println("Name:"+ user.getName()); 47 System.out.println("Email:"+ user.getEmail()); 48 System.out.println("Date of Birth:"+ user.getDob()); 49 model.addAttribute("msg", "Welcome to My World!"); 50 return "success"; 51 } 52 }
页面表单

<form:form action="save" method="post" commandName="user"> <tr> <td>User Name:</td> <td><form:input path="name"/> </td> <td> <form:errors path="name" cssStyle="color: red;"/></td> </tr> <tr> <td> Password :</td> <td><form:input path="password"/> </td> <td> <form:errors path="password" cssStyle="color: red;"/> </td> </tr> <tr> <td> Email :</td> <td><form:input path="email"/> </td> <td> <form:errors path="email" cssStyle="color: red;"/> </td> </tr> <tr> <td> Date of Birth :</td> <td><form:input path="dob"/> </td> <td> <form:errors path="dob" cssStyle="color: red;"/> </td> </tr> <tr> <td colspan=3> <input type="submit"> </td> </form:form>