1.校验理解
通常使用较多的是前端校验,比如页面js校验,对于安全性要求高一点的建议在服务器端校验。
服务器端校验:
控制层controller:校验页面请求参数的合法性,在服务器端控制层controller校验不区分客户端类型(浏览器,手机客户端,远程校验)
业务层service:(使用较多)主要校验关键业务参数,仅限于service接口使用的参数
持久层dao:一般不进行校验
2.springmvc校验
springmvc使用hibernate的校验框架validation
校验思路:
页面提交请求的参数,请求到controller方法中,使用validation进行校验,如果校验出错,将错误信息展示到页面
3.环境准备
hibernate的validation所需的jar包
hibernate-validation-4.3.0.Final.jar
jboss-logging-3.1.0.CR2.jar
validation-api-1.0.0.GA.jar
4.配置校验器
<bean id="validation" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!--校验器-->
<property name="providerClass" value="org.hibernate.validation.HibernateValidator" />
<!--指定校验使用的资源文件,在文件中进行配置校验错误的信息,如果不指定则默认为classpath下的ValidationMessage.properties-->
<property name="validationMessageSource" ref="messageSource"/>
</bean>
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:CustomValidationMessage</value><!--这里不加。properties是因为上面property中的
name是basenames-->
</list>
</property>
<!--文件编码方式-->
<property name="fileEncodings" value="utf-8" />
<!--对资源文件内容缓存时间单位是秒,120秒后重新加载-->
<property name="cacheSeconds" value="120" />
</bean>
PS:value 中的值在idea 中会出现红色错误,不影响使用
5.校验器注入到处理器适配器
<mvc:annotation-driven validator="validation"/>
6.在pojo中添加校验规则
如在字段上加一行代码
@Size(min=1,max=30,message="{资源文件的key值,用大括号括起来}")
private String name;
上面的两行代码表示校验名称在1到30个字符之间,message表示出错提示信息,
不在上面配置出错信息,就配置到上面的资源文件中,防止硬编码(资源文件中例:item.name.length.error=内容)
7.配置 .properties文件
item.name.length.error=字符长度不合适
8.在controller中进行校验捕获
将页面提交过来的pojo进行校验,在controller的pojo形参前加如:@Validated Item item,后面再加一个参数 BindingResult bindingResult)
如:
public String index(@Validated Item item , BindingResult bindingResult) {return null;}
注:1.在需要校验的pojo前面加@Validated在需要校验的pojo后面加BindingResult bindingResult 接收校验的出错信 息。
2.多个需要校验的,则@Validated 和 BindingResult bindingResult是配对出现的,并且顺序是固定的一前一后
在controller中获取校验错误信息:
if(bindingResult.hasErrors()) {
List<ObjectError> allErrors = bindingResult.getAllErrors();
for(ObjectError objectError:allErrors) {
输出(objectError.getDefaultMessage());}}
用来测试是不是捕获了错误信息
9.在页面显示校验的错误信息
需要在controller方法中将错误信息传到页面,使用Model,return的时候返回该页面
(具体的页面的修改,如何将错误信息显示在特定的位置这里不做说明)