数据校验:
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中的需要验证的成员变量上使用验证注解。