6.4.1 Spring的Validation校验框架
6.4 数据校验
输入校验
遇到非法输入时应用程序直接返回,提用户必须重新输入,也就是将那些非法输入过滤掉。这种对非法输入的过滤,就是输入校验,也称为数据校验”
输入校验分为客户端校验和服务器端校验,
- 客户端校验主要是过滤正常用户的误操作通常通过
JavaScript代码完成; - 服务器端校验是整个应用阻止非法数据的最后防线,主要通过在应用中编程实现
Spring MVC提供了强大的数据校验功能,其中有两种方法可以验证输入:
- 一种是利用
Spring自带的Validation校验框架; - 另一种是利用
JSR303(Java验证规范)实现校验功能。
6.4.1 Spring的Validation校验框架
Spring拥有自己独立的数据校验框架。Spring在进行数据绑定时,可同时调用校验框架来完成数据校验工作。Spring的校验框架在org.springframework.validation包中,其中重要的接口和类如下
Validator接口
Validator。最重要的接口。该接口有两个方法:
| 方法 | 描述 |
|---|---|
boolean supports(Class<?> clazz) |
该校验器能够对clazz类型的对象进行校验 |
void validate(Object target,Errors errors) |
对目标类target进行校验,并将校验错误记录在errors当中。 |
Errors接口
Errors是Spring用来存放错误信息的接口。Spring MVC框架在将请求数据绑定到入参对象后,就会调用校验框架实施校验,而校验结果保存在处理方法的入参对象之后的参数对象当中。这个保存校验结果的参数对象必须是Errors或者BindingResult类型。一个Errors对象中包含了一系列的FieldError和ObjectError对象。FieldError表示与被校验的对象中的某个属性相关的一个错误。BindingResult扩展了Errors接口,同时可以获取数据绑定结果对象的信息.
ValidationUtils工具类
ValidationUtils是Spring提供的一个关于校验的工具类。它提供了多个为 Errors对象保存错误的方法。
LocalValidatorFactoryBean类
LocalValidatorFactoryBean位于org.springframework.validation.beanvalidation包中,该类既实现了Spring的Validator接口,也实现了JSR303的Validator接口。只要在Spring容器中定义一个LocalValidatorFactoryBean,即可将其注入到需要数据校验的Bean中。定义一个LocalValidatorFactoryBean的Bean非常简单,如下代码所示:
<mvc:annotation-driven/>会默认装配好一个LocalValidatorFactoryBean,所以在实际开发中不需要手动配置LocalValidatorFactoryBean。需要注意的是,Spring本身没有提供JSR303的实现,如果要使用JSR303完成验证,则必须将JSR303的实现(注入Hibernate Validator)jar文件加入到应用程序的类路径下,这样Spring会自动加载并配好JSR303的实现.
实例 表单输入校验
loginForm.jsp
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> |
页面使用<form: errors>标签显示属性的错误信息。
User.java
1 | // 域对象,实现序列化接口 |
UserValidator.java
1 | // 实现Spring的Validator接口 |
UserValidator实现了Spring的Validator接口,其可以对User对象进行数据校验,并分别使用ValidationUtils的rejectIfEmpty方法和Errors的rejectValue方法对User进行数据校验。
写在类定义上面的@Repository("userValidator")注解将该对象声明为Spring容器中的一个Bean,名字为”userValidator“。
UserController.java
1 |
|
login方法对传进来的参数进行校验,注意方法的最后一个参数errors,该参数是个Spring校验框架的Errors对象。在该方法中调用了之前写的userValidator类进行数据校验,如果校验失败,则跳转到”loginForm“视图.
测试
错误填写

显示效果

最后说一句
由于早期Spring就提供了Validation框架,所以之前的很多应用都使用Validation框架进行数据校验。由于Validation框架通过硬编码完成数据校验,在实际开发中会显得比较麻烦,因此现代开发更加推荐使用JSR 303完成数据校验。