springMVC中validation校验案例
validation校验相比于大部分前台js校验更加简单,因为在后台进行校验,安全性较高
1、导入支持的jar包
2、配置springMVC.xml
(1)不使用映射器和适配器的情况下
<!-- 可以替代映射器和适配器 -->
<mvc:annotation-driven validator="validator"/>
<!-- 校验器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 注入Hibernate校验器 -->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<!-- 指定校验所使用的资源文件,如果不指定默认使用classes下面的 -->
<property name="validationMessageSource" ref="messageSource"/>
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名 -->
<property name="basenames">
<list>
<value>
classpath:CustomValidationMessages
</value>
</list>
</property>
<!-- 资源文件的编码格式 -->
<property name="fileEncodings" value="utf-8"/>
<!-- 对资源文件缓冲时间 -->
<property name="cacheSeconds" value="120"/>
</bean>
(2)使用映射器和适配器的情况
<!-- 注解映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- 注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<!-- 引用自定义属性编辑器 -->
<property name="webBindingInitializer" ref="customBinder"/>
</bean>
<!-- 自定义的属性编辑器 -->
<bean id="customBinder" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="validator" ref="validator"/>
</bean>
<!-- 校验器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 注入Hibernate校验器 -->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<!-- 指定校验所使用的资源文件,如果不指定默认使用classes下面的 -->
<property name="validationMessageSource" ref="messageSource"/>
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名 -->
<property name="basenames">
<list>
<value>
classpath:CustomValidationMessages
</value>
</list>
</property>
<!-- 资源文件的编码格式 -->
<property name="fileEncodings" value="utf-8"/>
<!-- 对资源文件缓冲时间 -->
<property name="cacheSeconds" value="120"/>
</bean>
3、创建CustomValidationMessages.properties
4、校验规则
在实体类中加入注解
public class User {
private Integer uid;
// 商品名称长度限制在1-30之间
@Size(min = 1, max = 30, message = "{user.name.length.error}")
private String username;
@Size(min = 1, max = 30, message = "{user.password.length.error}")
private String password;
private String context;
// 创建时间不能为空
// 通过groups制定该校验属于哪个分组,可以制定多个分组
@NotNull(message = "{user.createtime.is.notnull}", groups = { ValidGroup1.class })
private Date createtime;
5、捕获异常的方法
@RequestMapping("inserUser")
// 每个需要校验的pojo前面都需要加Validdated,后面都加BindingResult bindingResult
public String insertUser(@Validated User user, BindingResult bindingResult,
Model model) {
// 如果校验中存在错误
if (bindingResult.hasErrors()) {
List<ObjectError> errors = bindingResult.getAllErrors();
// 将错误信息放入ModelAndView中
model.addAttribute("errors", errors);
for (ObjectError objectError : errors) {
// 输出错误信息到控制台
System.out.println(objectError.getDefaultMessage());
}
// 跳转回添加页面
return "user/user_add";
}
6、在页面简单展示错误信息
<c:forEach items="${errors }" var="e">
${e.defaultMessage }
</c:forEach>
7、分组校验
某些方法只想校验部分属性时使用
(1)创建分组接口
package com.yy.controller.validation;
/**
* 校验分组:用于修改的校验
*
* @author 杨扬 2017-3-21下午8:09:33
*/
public interface ValidGroup1 {
// 接口不定义方法,只定义标识哪些校验规则属于ValidGroup1
}
(2)通过groups在po类中确定分组
// 通过groups制定该校验属于哪个分组,可以制定多个分组
@NotNull(message = "{user.createtime.is.notnull}", groups = { ValidGroup1.class })
private Date createtime;
(3)在controller的方法中定义使用校验的分组
// 在@ValidTed(value={}),在value中定义ValidGroup1分组的校验
public String insertUser(
@Validated(value = { ValidGroup1.class }) User user,
BindingResult bindingResult, Model model) {