【SpringMVC学习06】SpringMVC中的数据校验
本文内容纲要:
-1.环境准备
-2.配置校验器
-3.在pojo中添加校验
-4.捕获校验错误信息
-5.分组校验
这一篇博文主要总结一下springmvc中对数据的校验。在实际中,通常使用较多是前端的校验,比如页面中js校验,对于安全要求较高的建议在服务端也要进行校验。服务端校验可以是在控制层conroller,也可以是在业务层service,controller校验页面请求的参数的合法性,在服务端控制层conroller的校验,不区分客户端类型(浏览器、手机客户端、远程调用);service层主要校验关键业务参数,仅限于service接口中使用的参数。这里主要总结一下何如使用springmvc中controller的校验。
1.环境准备
springmvc中我们使用hibernate的校验框架validation(注:和hibernate没有任何关系),使用这个校验框架的话,需要导入jar包(下载地址)http://download.csdn.net/detail/eson_15/9555247,如下:
2.配置校验器
在springmvc.xml配置文件中配置一下校验器,如下:
<!--配置校验器-->
<beanid="validator"class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!--校验器,使用hibernate校验器-->
<propertyname="providerClass"value="org.hibernate.validator.HibernateValidator"/>
<!--指定校验使用的资源文件,在文件中配置校验错误信息,如果不指定则默认使用classpath下面的ValidationMessages.properties文件-->
<propertyname="validationMessageSource"ref="messageSource"/>
</bean>
<!--校验错误信息配置文件-->
<beanid="messageSource"class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!--资源文件名-->
<propertyname="basenames">
<list>
<value>classpath:CustomValidationMessage</value>
</list>
</property>
<!--资源文件编码格式-->
<propertyname="fileEncodings"value="utf-8"/>
<!--对资源文件内容缓存时间,单位秒-->
<propertyname="cacheSeconds"value="120"/>
</bean>
配置规则就是bean和property属性,别把class和文件名写错了就行,这里有个配置是资源文件名,这个文件中我们将会配置一些错误信息。配置好了校验器后,需要将校验器注入到处理器适配器中,还是在springmvc.xml文件中,将我们配好的validator注入进去,如下:
这样校验器就配置好了。
3.在pojo中添加校验
hibernate校验框架提供了很多注解校验,我先简单罗列一下:
上面我简单罗列了一些校验的注解,不同的注解的具体使用方法可以参考官方文档或者网上资料,这里我选择两个注解来说明如何使用这个hibernate验证框架。首先在自己的pojo中需要验证的属性上添加相应的验证注解:
我们看到注解中可以指定message,那么这个message中的内容是错误消息配置文件中对应的key,取出来的就是对应的错误消息,所以针对这两个错误消息,我们写一下配置文件:
4.捕获校验错误信息
上面已经将校验相关的配置都配好了,接下来就需要在controller的方法中捕获校验结果中的错误信息,然后将这些错误信息传到前台去显示。那么controller的方法中该如何去捕获呢?如下:
可以看出,在需要校验的pojo前边添加@Validated,在需要校验的pojo后边添加BindingResultbindingResult来接收校验出错信息。值得注意的是:@Validated和BindingResultbindingResult是配对出现,并且形参顺序是固定的(一前一后)。这样就可以顺利接收到错误信息了。关于前台的东西,我就不写了。
5.分组校验
上面已经能完成springmvc的校验功能了,但是有个问题:刚刚是在pojo中定义了校验规则,但是pojo是被多个controller使用的,现在假如两个不同的controller使用的校验规则是不一样的,简单来说,一个controller不需要去校验生产日期,只要校验一下商品名称即可,另一个controller两个都要校验,这样就没法做了,因为两个controller都使用同一个pojo。
为了解决这个问题,我们可以定义多个校验分组(其实是一个Java接口),分组中定义有哪些规则,每个controller方法使用不同的校验分组即可。看一下下面的例子就明白了:
首先定义一个校验分组:
publicinterfaceValidGroup1{
//接口中不需要定义任何方法,仅仅是对不同的校验规则进行分组
//此分组只校验商品名称的长度
}
然后我们在刚刚的pojo中,添加这个分组,如下:
再看一下想要校验这个name字段的controller中是如何配置的:
这样该controller就不会去校验生产日期的字段了,通过这种方式可以解决不同的controller校验不同字段的问题。
本文内容总结:1.环境准备,2.配置校验器,3.在pojo中添加校验,4.捕获校验错误信息,5.分组校验,
原文链接:https://www.cnblogs.com/shanheyongmu/p/5871312.html