Spring MVC利用Hibernate Validator实现后端数据校验(一)

数据校验:

1.前端数据校验:
使用JS代码进行的前端数据校验
可以使用前端数据校验的框架:
Jquer.Validation-xxx.js

2.后端数据校验
主要使用JAVA代码进行数据校验
后端数据校验是有框架的:Java自己做了一个后端数据校验的规则——BeanValidation
BeanValidation后端数据校验规则由Hibernate所在公司实现

SpringMVC中使用BeanValidation进行后端校验的,BeanValidation是Java中定义的一种后端数据校验的规范,这个规范由Hibernate实现。

为什么要做数据校验

  “用户的输入是邪恶的”——能让用户动鼠标,决对不要让用户使用键盘。


SpringMVC中如何做数据校验
  SpringMVC数据校验沿用了JavaEE中的BeanValidation,BeanValidation是一个规范——JSR303。
  Java当中只要提到规范内容,其语言实现上就是使用的接口。
  这个BeanValidation由Hibernate实现。
  在此就可以使用Hibernate对BeanValidation的实现完成数据校验。

JSR 303、JSR 349与Bean Validator
        笼统来说,就是Java规定了一套关于验证器的API,规范先后发了两版,就是所谓的JSR 303与JSR 349。然后提出了基于规范的实现:Bean Validator。JSR 303是最早的,其对应了Bean Validator 1.0的版本,比较菜,然后后来扩展了JSR 349,提出了依赖注入、注解等内容,称为了Bean Validator。

        关于Bean Validator,这并不是一项技术,也算是一种规范,需要对其实现。而博文使用的Hibernate Validator就是其中一种。因为Spring MVC本身不提供validator的,所以我们需要其他的代替。下面是Wikipedia的一些内容:

大概翻译一下,就是Java Bean的数据验证(JSR 303),起源于2009今年批准的框架,并成为Java EE 6的一部分。而hibernate团队提供了其一种实现。所以Hibernate Validator其实与SSH的那个H:Hibernate,并不是其子集。(可能吧,并没有接触过hibernate)。

Hibernate Validator
        上面也说过了其由来,这里简单说明一下运行过程。JSR 349提出了注解约束,所以一般使用注解了。除去在项目中的配置,我们可以在Java Bean中的属性上使用注解来进行数据约束。在Spring MVC中,利用IoC处理对象的时候就会触发数据验证。例如提交表单的时候,dispatcher接收的时候,就会根据约束来判定数据是否正确。如果有不正确的,就会根据声明的message,将其添加到Error中,Spring MVC中一般使用BlindingResult对象来获取,然后就能对错误的数据进行处理了。

Hibernate Validator
        上面也说过了其由来,这里简单说明一下运行过程。JSR 349提出了注解约束,所以一般使用注解了。除去在项目中的配置,我们可以在Java Bean中的属性上使用注解来进行数据约束。在Spring MVC中,利用IoC处理对象的时候就会触发数据验证。例如提交表单的时候,dispatcher接收的时候,就会根据约束来判定数据是否正确。如果有不正确的,就会根据声明的message,将其添加到Error中,Spring MVC中一般使用BlindingResult对象来获取,然后就能对错误的数据进行处理了。

操作步骤:

Hibernate的BeanValidation数据校验需要的包
  hibernate-validator-xxx.jar   (xxx表示版本号)

第一步:下载hibernate-validator-xxx.jar包及相关的jboss-logging-xxx.jar,classmate-xxx.jar

在maven项目的pom.xml中添加:

点击保存,会有以下四个jar包,依赖关系带下来的。

 

第二步:配置SpringMVC的BeanValidator

<mvc:annotation-drive/>节点的validator属性:表示提供一个BeanValidator,而BeanValidator的实现,是使用HibernateValidator。

在SpringMVC中使用LocalValidatorFactoryBean加载验证实现。

第三步:在要验证的处理请求的方法的参数上加上注解@Valid,并在使用了@Valid参数后紧跟一个BindingResult接口参数

第四步:判断BindingResult中的错误

 

 

 步骤暂停,我们来启动服务先测试一下

启动服务器之后控制台输出一下异常:(如果没有出现下面的异常,请翻到第五步)

这是因为导入的jar包重复了,那重复的是哪一个呢?看下面

在之前我导入了javaee-api,这个jar包里面也有一个validator,在javaee-api里面带有validator-api。

这个时候移除多余的validator-api的jar包,不能移除javaee-api这个包,移除了你的servlet就没有了。

 移除方法:

 

点击保存之后,你就会看到validator-api包没有了哟

再次重启服务器运行,这个时候控制台又输出一个错误:

 

没有找到javax/validation/ClockProvider,这个时候到javaee-api包下面去找:

确实没有这个时候怎么办呢,又不能再添加一个validator-api,添加就会重复,删除javaee-api用validator-api的话servlet又不能用了,这个时候就可以用javaee-api高一点的版本,我这里用的是7.0的,我把它改成8.0试试

在pom.xml文件中改版本号,点击保存等待下载就ok了,下载好了再来看:

 这个时候就有javax/validation/ClockProvider

 又再次启动服务器,又有异常了。。。。。。

看到ClassNotFoundException就知道缺包了,

JSON对应的依赖包,常用有三种json解析jackson、fastjson、gson。

添加以下这三个包:

jackson-core-xxx.jar

jackson-annotations-jar

jackson-Databind-xxx.jar

到这一步,再次重启服务器,终于没有异常了,大哭。。。。。。

到现在总共加了六个包进来

第五步:在需要验证的JavaBean上使用使用验证注解

第六步:处理校验结果

 

校验页面处理:

小结:

1.BeanValidation:javax中的Bean校验规范,规范由Hibernate实现
2.提供校验实例
3.在控制器处理方法的参数上使用@Valid,并在该参数后加上一个BindingResult接口参数
4.验证Bean中的需要验证的成员变量上使用验证注解。

原文地址:https://www.cnblogs.com/xss512/p/10972683.html