>>分享孙卫琴的Java技术专稿和著作 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 12808 个阅读者 刷新本主题
 * 贴子主题:  【Spring专题】Spring框架的数据验证机制 回复文章 点赞(0)  收藏  
作者:sunweiqin    发表时间:2021-10-09 11:19:56     消息  查看  搜索  好友  邮件  复制  引用

本文参考《精通Spring:JavaWeb开发技术详解》,作者:孙卫琴,清华大学出版社出版

Spring框架本身也提供了一套数据验证机制。运用这套验证机制包括以下两个步骤:
(1)创建实现org.springframework.validation.Validator接口的数据验证类。在本范例中为PersonValidator类。
(2)在Spring MVC框架中创建数据验证类的对象并通过它进行数据验证。

1. 实现Spring的Validator接口

Spring API提供了一个数据验证接口:
org.springframework.validation.Validator接口。以下例程1的PersonValidator类实现了Validator接口。PersonValidator类会验证Person类的userName属性和password属性。

例程1 PersonValidator.java

package mypack;
import org.springframework.validation.Errors;  
import org.springframework.validation.ValidationUtils;  
import org.springframework.validation.Validator;

public class PersonValidator implements Validator{  

  public boolean supports(Class<?> clazz) {
     returnPerson.class.equals(clazz);  
  }  
  
  public voidvalidate(Object obj, Errors errors) {  

   ValidationUtils.rejectIfEmpty(errors, "userName",
                                  "person.no.username.error");

   ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password",
                                  "person.no.password.error");

    Personperson=(Person) obj;
    if(person.getPassword() != null  && person.getPassword()!=""
              && person.getPassword().length()!=6){
     errors.rejectValue("password",
                            "person.tooshort.password.error");
    }
  }
}

PersonValidator类实现了Validator接口的以下方法:
(1)supports()方法:指定PersonValidator类所验证的数据类型。
(2)validate()方法:进行数据验证。

PersonValidator类的validate()方法首先利用ValidationUtils类来验证Person对象的userName属性和password属性。ValidationUtils类是Spring API提供的用于数据验证的实用类,它有以下常用的静态方法:
(1)rejectIfEmpty():如果待验证数据为空,就生成错误消息。验证逻辑等同于Hibernate Validator的@NotEmpty注解。
(2)rejectIfEmptyOrWhitespace():如果待验证数据去除两端空格后为空,就生成错误消息。验证逻辑等同于Hibernate Validator的@NotBlank注解。

ValidationUtils类的rejectIfEmpty()和rejectIfEmptyOrWhitespace()都有一些重载方法。以下是rejectIfEmpty()的常用重载方法:
(1)rejectIfEmpty(Errors errors, String field, String errorCode) :参数errorCode指定错误消息编号。
(2)rejectIfEmpty(Errors errors, String field, String errorCode, StringdefaultMessage) :参数defaultMessage):参数defaultMessage指定默认的错误消息文本。

2. 用数据验证类进行数据验证

对于PersonValidator对象,到底由谁来创建并管理它的生命周期,并且如何在控制器类中使用它呢?创建以及使用PersonValidator对象有三种方式。

2.1把PersonValidator对象和PersonController的当前DataBinder对象绑定

在PersonController控制器类中,以下initBinder()方法会把PersonBinder对象加入到当前的DataBinder对象中:

@InitBinder  
public void initBinder(DataBinder binder) {  
binder.setValidator(new PersonValidator());  
}

org.springframework.validation.DataBinder类是Spring框架提供的用来存放数据验证对象的容器类。以上initBinder()方法用@InitBinder注解标识,Spring MVC框架在每次调用PersonController的请求处理方法之前,先调用initBinder()方法,创建PersonValidator对象,并把它与当前的DataBinder对象绑定。这个PersonValidator对象专门为PersonController的请求处理方法进行数据验证。

PersonController的请求处理方法可以通过JSR-303的@Valid注解来声明对person参数进行数据验证:

public String greet(   @Valid @ModelAttribute("personbean")Person person,
          BindingResult bindingResult,Model model){……}

以上@Valid注解声明要对person参数进行验证,Spring MVC框架就会利用与当前DataBinder对象绑定的PersonValidator进行相应的数据验证。

2.2注册PersonValidator Bean组件,并把它设为全局的数据验证类

在Spring MVC的配置文件中配置PersonValidator类的代码如下:

<bean id="personValidator" class="mypack.PersonValidator"/>
<mvc:annotation-drivenvalidator="personValidator" />

以上<bean>元素向Spring MVC框架注册了PersonValidator Bean组件,<mvc:annotation-driven>的validator属性指向这个PersonValidator Bean组件。这样,当控制器类需要对Person类型的数据进行验证时,Spring MVC框架就会利用PersonValidator对象来完成实际的数据验证功能。按照这种方式配置的PersonValidator对象的数据验证范围是整个Web应用。

PersonController的请求处理方法可以通过JSR-303的@Valid注解来声明对person参数进行数据验证:

public String greet(  @Valid
           @ModelAttribute("personbean")Person person,
          BindingResult bindingResult,Model model){……}

以上@Valid注解声明要对person参数进行验证,Spring MVC框架就会利用全局范围内的PersonValidator进行相应的数据验证。

值得注意的是,PersonValidator并没有提供通用的数据验证功能,只能对Person类型的数据进行验证,把它作为全局的数据验证类,实际上并不值得推荐。

2.3注册PersonValidator Bean组件,PersonController通过@Resource注解访问它

在Spring MVC的配置文件中配置PersonValidator类的代码如下:

<bean id="personValidator" class="mypack.PersonValidator"/>

以上<bean>元素向Spring MVC框架注册了PersonValidator Bean组件,Spring MVC框架会负责管理PersonValidator对象的生命周期。

在PersonController类中,通过来自javax.annotation包的@Resource注解访问由Spring MVC框架提供的PersonValidator对象:

@Controller
public class PersonController {
  @Resource
  //由Spring MVC框架提供PersonValidator对象
  private PersonValidator personValidator;
  @RequestMapping(value = {"/input","/"},method =RequestMethod.GET)

  public String init(Model model) {
    model.addAttribute("personbean",new Person());
    return"hello";
  }

@RequestMapping(value = "/sayHello", method =RequestMethod.POST)
  public String greet( @ModelAttribute("personbean")Person person,
          BindingResult bindingResult,Model model) {

    personValidator.validate(person,bindingResult);
  
    if(bindingResult.hasErrors()){
      return"hello";
    }
    ……
  }
}

PersonController类的personValidator成员变量用@Resource注解标识,意味着PersonController类无需创建PersonValidator对象,Spring MVC框架会把PersonValidator Bean组件赋值给personValidator成员变量。


程序猿的技术大观园:www.javathinker.net
  Java面向对象编程-->类的生命周期
  JavaWeb开发-->Web运作原理(Ⅲ)
  JSP与Hibernate开发-->映射对象标识符
  Java网络编程-->创建非阻塞的HTTP服务器
  精通Spring-->Vue组件开发基础
  Vue3开发-->Vue组件开发高级技术
  【Vue.js技术专题】路由管理器的基本用法
  【Vue.js技术专题】命名路由
  【Vue.js技术专题】自定义指令范例:v-drag指令
  【Spring Cloud Alibaba专题】SkyWalking整合MySQL
  【Spring Cloud Alibaba专题】Seata的架构
  【Spring Cloud Alibaba专题】按照集群模式搭建Redis集群
  【Spring专题】Spring MVC是否过时?
  【Spring专题】控制器对象的生命周期
  【Spring专题】通过JPA API实现Repository接口
  【持久化专题】JPA API的基本用法
  【持久化专题】JPA的事件处理API的用法
  【持久化专题】EntityManager和Session的merge()方法详解
  【JavaWeb专题】在JavaWeb应用中对客户请求的异步处理
  《大话Java程序设计从入门到精通》写作花絮
  【Java基础编程专题】Java集合的批量操作
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。