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
完成数据校验。