SpringMVC学习之服务器端校验

来源:互联网 发布:时代网络大厦 联想电脑 编辑:程序博客网 时间:2024/06/03 17:25

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.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>


5.校验器注入到处理器适配器
<mvc:annotation-driven validator="validator"/>
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的时候返回该页面

(具体的页面的修改,如何将错误信息显示在特定的位置这里不做说明)

原创粉丝点击