Spring_MVC前段数据验证,Validater验证器

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";  
    }  
     
}  









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值