• 后端——框架——容器框架——spring_core——《官网》阅读笔记——第三章节1(校验器)


      校验器的知识点大致可以分为三个部分

    1. 第一部分介绍与校验功能相关的类
    2. 第二部分介绍校验器实现方式。
    3. 第三部分介绍如何获取校验结果。

    1、相关类

      Spring中使用Validator接口实现校验功能,它只有两个方法

    1. Supports:用于判断校验器适用于哪些对象。
    2. Validate:实现校验功能的逻辑,第一个参数为校验对象,第二个参数为校验的结果。

      在数据绑定的功能中,校验只是其中的子功能,Spring使用DataBinder类实现数据绑定功能,该对象也可以触发校验功能,它包含一个或多个校验器,有List<Validator>属性。

      Spring还提供了ValidationUtils,它是一个工具类,提供一些常见的方法,例如对象是否为空,字符串属性是否为NULL或空白字符。

      注:Validator和DataBinder都有自己的类结构

    2、实现方式

      Spring支持三种校验方式。

    1. 第一种是JSR-303相关的注解API,具体参考Hibernate Validator。
    2. 第二种是代码方式,使用Validator或者是DataBinder的validate方法。
    3. 第三种是数据绑定过程中自动触发,例如请求参数转换为Controller方法中的参数。

    2.1   HibernateValidator

      待补充。

    2.2  代码方式

      代码方式的步骤如下,

    1. 第一步,编写自定义校验器,实现Validator接口。示例中校验用户的姓名和年龄
    public class UserValidator implements Validator {
    
    	public boolean supports(Class<?> clazz) {
    		return User.class.isAssignableFrom(clazz);
    	}
    
    	public void validate(Object target, Errors errors) {
    		// 判断姓名是否为空
    		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "姓名不能为空");
    		// 转换为User对象
    		User user = (User) target;
    		if (user.getAge() < 0) {
    			errors.rejectValue("age", "年龄不能小于0");
    		} else if (user.getAge() > 100) {
    			errors.rejectValue("age", "年龄不能大于100");
    		}
    	}
    }
    

      2.第二步,注册校验器,DataBinder方式是调用addValidator方法,Validator实现类方式是获取Validator实现类,可以直接new,也可以从IOC容器中获取。

      调用Validator或者DataBinder的validate方法。代码如下:

    •  DataBinder的validate方法,调用xxValidator的方法,添加,替换,删除校验器

    /**
     * 
     * @Title: testValidator
     * @Description: 测试校验器,调用DataBinder的validate方法
     */
    public static void testDataBinder() {
    	ApplicationContext context = getContext();
    	// 获取User对象
    	User user = context.getBean("singleton_user", User.class);
    	//
    	DataBinder binder = new DataBinder(user);
    	// 注册validator
    	binder.addValidators(new UserValidator());
    	// 校验
    	binder.validate();
    	// 获取结果
    	BindingResult result = binder.getBindingResult();
    	// 获取
    	List<FieldError> errors = result.getFieldErrors();
    	// 输出User对象
    	System.out.println(user.toString());
    	//
    	for (FieldError error : errors) {
    		System.out.println(error.getField() + ": " + error.getCode());
    	}
    }
    • Validator的validate方法,直接new,或者从IOC容器中获取。
    /**
     * 
     * @Title: testValidator
     * @Description: 测试校验器
     */
    public static void testValidator() {
    	ApplicationContext context = getContext();
    	// 获取User对象
    	User user = context.getBean("singleton_user", User.class);
    	// 创建UserValidator实例
    	UserValidator validator = new UserValidator();
    	// 创建Error对象
    	BindingResult result = new BeanPropertyBindingResult(user, "user");
    	// 校验
    	validator.validate(user, result);
    	// 输出User对象
    	System.out.println(user.toString());
    	// 输出校验结果
    	System.out.println(result.getFieldErrorCount());
    }

    上述方式是直接new创建Validator,从IOC容器中获取Validator的方式,XML方式下配置validator接口的实现类,注解方式下在实现类上添加@Component注解。

    2.3   数据绑定

      在数据绑定的过程中,可以添加校验器,实现校验功能。最常见的数据绑定过程是请求的参数转换为Controller类中方法的参数,这个过程是自动的。不过可以修改,添加自定义的过滤器

    @Controller
    public class MyController {
    
        @InitBinder
        protected void initBinder(WebDataBinder binder) {
            // 添加自定义校验器,在方法中添加Errors参数对象,获取校验结果
            binder.addValidators(new XXValidator());
        }
        
        // 请求参数转换为User对象, Errors对象获取校验结果
        @GetMapping("/urlPath")
    	public String test(User user, Errors errors) {
    		return "您好 " + user.getName();
    	}
    }
    

    3、获取校验结果

      当为代码方式时,当使用DataBinder的validate方法之后,可以调用getBindingResult对象返回结果对象,调用BindingResult对象的相关API可以获取校验的结果,这个接口继承Errors接口。

      当使用Validator时,在使用validate方法之前,必须先创建一个Errors的实现类,在示例中我使用的BeanPropertyBindingResult,然后把该对象作为参数传入到validate方法中,之后调用它的API获取校验的结果。

      当为数据绑定方式时,在请求参数转换为对象方法参数的过程中,可以在方法中添加Errors参数,之后调用它的API获取校验的结果。

  • 相关阅读:
    python测试开发django-115.Paginator分页器展示table表格数据
    python面试题-如"上海 深圳 深圳 上海",要求输入一个匹配模式,比如: aabb,判断是否符合
    python测试开发django-114.ModelForm中局部钩子(clean_)和全局钩子校验
    python测试开发django-113.使用Bootstrap框架
    MySQL将查询的结果作为update更新的数据,且在原字段数据后 CONCAT拼接(lej)
    MongoDB和Redis的区别是什么
    【精选】由浅入深带你吃透MQ原理与应用场景
    mysql 往表中某个字段的字符串后追加字符串
    mongodb 安装及使用
    Redis和MongoDB的区别(面试受用)
  • 原文地址:https://www.cnblogs.com/rain144576/p/12272447.html
Copyright © 2020-2023  润新知