一、导包
Jar包:
hibernate-validator-4.3.0.Final
jboss-logging-3.1.0.CR2
validation-api-1.0.0.GA
Maven:
二、配置错误信息定义文件springmvc_validate.properties
user.nameIsInvalidate=用户名长度应该在3到10之间
user.hobbyIsInvalidate=兴趣至少选一个,至多选3个
三、配置springmvc.xml文件
<!--错误信息资源-->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!--资源文件列表-->
<property name="basenames">
<list>
<!-- 注意:这里没有后缀名properties -->
<value>classpath:springmvc_validate</value>
</list>
</property>
<!--资源文件编码格式-->
<property name="defaultEncoding" value="utf-8"/>
<!--对资源文件内容缓存时间-->
<property name="cacheSeconds" value="120"/>
</bean>
<!--校验器-->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<property name="validationMessageSource" ref="messageSource"/>
</bean>
<!--使用校验器-->
<mvc:annotation-driven validator="validator"/>
四、定义校验规则
- 在POJO类的属性上添加验证注解
控制方法的POJO参数注解@Validated,并且后面紧跟一个类型为BindingResult参数
一个BindingResult对应一个POJO形参,并且需要紧跟在形参后面。
如果验证失败,通过遍历BindingResult.getAllErrors[i].getDefaultMessage获取错误信息。
验证注解
@Null 被注解的元素必须为null,对于基本类型(如int,float)肯定校验失败
@NotNull 被注解的元素必须不为null,对于基本类型肯定校验成功
@AssertTrue 被注解的元素必须为true
@AssertFalse 被注解的元素必须为false
@Min(int value) 被注解的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(int value) 被注解的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(String value) 被注解的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(String value) 被注解的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min) 被注解的集合或字符串的长度必须在指定的范围内,最好用在集合上(如果列表为Null,会跳过该验证)
@Digits(integer,fraction) 被注解的元素必须是一个数字,其整数位数不大于integer,小数位数不大于fraction
@Past 被注解的元素必须是一个过去的日期
@Future 被注解的元素必须是一个将来的日期
@Pattern(regex,flag) 被注解的元素必须符合指定的正则表达式
@NotBlank 被注解的字符串必须非null,且长度大于0,且调用trim()后长度大于0(即要求有内容,不能只有空格)
@Email 被注解的元素必须是电子邮箱地址
@Length(min,max) 被注解的字符串的大小必须在指定的范围内
@NotEmpty 被注解的字符串的必须不为null,且长度大于0
@Range(min,max) 被注解的元素必须在合适的范围内
验证分组
目的是构建业务与验证之间的多对多关系,使得不同的页面对应不同的验证,更加灵活。
例如:注册需要验证user的name,pass,sex,email是否符合要求,登录只需验证name,pass是否为空即可。
如果没有分组,那么注册登录要不就是都验证所有输入的合法性,要不就是都仅仅验证非空,不灵活。
使用:
1. 定义若干个接口作为分组的标识(接口什么也不用写)
2. POJO类的相关属性的验证注解的参数groups填上接口
3. 控制方法的POJO形参的@Validated的参数value填上接口
使用示例
// TODO
五、如果数据是中文,需要定义过滤器
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>