SpringMVC的验证机制,使用SpringMVC提供的Validator接口来对该实体类进行校验的时候:
1,创建一个Validator的实现类,并实现Validator接口的supports方法和validate方法。
//创建一个对User类进行验证的类
public class UserValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return null;
}
@Override
public void validate(Object obj, Errors errors) {
}
}
2,使用Supports方法用于判断当前的Validator实现类是否支持校验当前需要校验的实体类
public boolean supports(Class<?> clazz) { // 使用反射机制,校验当前类对象clazz是否是需要验证的User对象 return User.class.equals(clazz); }
3.在validate方法中编写验证规则,当supports方法的返回结果为true的时候,Validator接口实现类的validate方法被调用来对当前需要校验的实体类进行校验方法中的obj就是f form表单从前段传到后台的封装好的user对象,其中含有form表单中提交过来的各个参数即呗Spring封装好的use对象中的需要验证的各个属性,例如:验证表单中的值不能为空public void validate(Object obj, Errors errors) { //errors是用来存放错误信息的对象,并将错误信息返回给前台页面 //将obj转换成需要验证的user对象 User user = (User) obj; //ValidationUtils是Spring中定义的含有各种验证方法的验证工具类如下:验证userName不能为空 ValidationUtils.rejectIfEmpty(errors, "username", null, "Username is empty."); // if (null == user.getPassword() || "".equals(user.getPassword())) //ValidationUtils验证用户密码为空 errors.rejectValue("password", null, "Password is empty."); }
4,调用验证器,对所需验证的数据进行验证,例如:@Controller public class UserController { /** @InitBinder标记的方法initBinder设置了当前Controller需要使用的Validator是UserValidator。 * 这样当我们请求处理器方法login时就会使用DataBinder设定的UserValidator来校验当前的表单对象User, * 首先会通过UserValidator的supports方法判断其是否支持User对象的校验, * 若支持则调用UserValidator的validate方法,并把相关的校验信息存放到当前的Errors对象中。 * */ @InitBinder public void initBinder(DataBinder binder) { binder.setValidator(new UserValidator()); } @RequestMapping("login") //在需要验证的对象前使用@Valid注解,调用自定义的 public String login(@Valid User user, BindingResult result) { if (result.hasErrors()) return "redirect:user/login"; return "redirect:/"; } }
4.1 Controller类中通过@InitBinder标记的方法只有在请求当前Controller的时候才会被执行,即调用验证方法时,必须现在调用验证器中的验证方法前初始化绑定指定的验证器,每初始化一次只能在后面紧跟的调用验证器的方法中使用,
4.2因此当需要一个Validator对所有的Controller都起作用的话,必须使用WebBindingInitializer的initBinder方法来设定了。或者,在SpringMVC的配置文件中通过mvc:annotation-driven的validator属性也可以指定全局的Validator 如下:
//在springmvc_config.xml中使用 <mvc:annotation-driven validator="userValidator"/> <bean id="userValidator" class="com.xxx.xxx.UserValidator"/>
*4.3*,在需要调用验证器的方法 参数中注入 BindingResult 对象errors 在调用验证器的控制器中依赖注入要被调用的自定义验证器或直接在调用的方法体中直接实例化自定义的UserValidater 验证器实例化对象validater;代码如下
@RequestMapping("/user_add") public String add(Model model, @ModelAttribute("user") User user, BindingResult errors) { // 保存用户信息, UserForm来接收前端输入的用户信息 // TODO 从前台获取数据之后,再转成Service层识别的实体类 // 验证前台数据的有效性 UserFormValidater validater = new UserFormValidater();//或调用当前controller中注入的成员属性验证器 validater.validate(user, errors); if (errors.hasErrors()) { return "user_input"; } return "user_info"; // 默认加上ViewResolver的prefix+字符串+suffix }
5.基于注解的jsr303验证
JSR-303是一个规范,当我们在SpringMVC中需要使用到JSR-303的时候就需要我们提供一个对JSR-303规范的实现,Hibernate Validator实现了这一规范
JSR-303的校验是基于注解的,它内部已经定义好了一系列的限制注解,我们只需要把这些注解标记在需要验证的实体类的属性上或是其对应的get方法上。
public class User { private String username; private String password; private int age; //验证属性username不能为空 @NotBlank(message="用户名不能为空") public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } //验证属性password不能为空 @NotNull(message="密码不能为null") public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } //验证age最小值不能小于10 @Min(value=10, message="年龄的最小值为10") public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
5.1,使用jsr303的注解验证是一种简洁清晰的验证方式,不需要编写专门的验证器,不用 绑定初始化验证器,只需导入hiberna-validation的所在JAR包并对相应参数的get方法加上需要验证的注释,配置文件中配置一下就行 常用的注解如下
5.1.2,
1将SR-303的实现者对应的jar包放到lib中或者pom文件中导入,
2.开启注解驱动<mvn:annotation-driven/>,之后Spring会自动把对应的校验错误信息放到Spring的Errors对象中
3.此时的验证就会变成全局验证不用专门绑定初始化验证器直接调用@Valid注解给要验证的对象既可
@Controller public class UserController { @RequestMapping("login") public String login(@Valid User user, BindingResult result) { if (result.hasErrors()) return "user_login"; return "success"; } }