对前端的校验大多数通过js在页面校验,这种方法比较简单,如果对安全性考虑,还要在后台校验。
springmvc使用JSR-303(javaEE6规范的一部分)校验规范,springmvc使用的是Hibernate Validator(和Hibernate的ORM)
加入Hibernate Validator的jar
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
配置springmvc.xml
在spring3之后,任何支持JSR303的validator(如Hibernate Validator)都可以通过简单配置引入,只需要在配置xml中加入,这时validatemessage的属性文件默认为classpath下的ValidationMessages.properties:
<mvc:annotation-driven />
如果不使用默认,可以使用下面配置:
<mvc:annotation-driven validator="validator" />
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<!--不设置则默认为classpath下的ValidationMessages.properties -->
<property name="validationMessageSource" ref="validatemessageSource"/>
</bean>
<bean id="validatemessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- validatemessages.properties文件 -->
<property name="basename" value="classpath:validatemessages"/>
<property name="fileEncodings" value="utf-8"/>
<property name="cacheSeconds" value="120"/>
</bean>
配置validatemessages.properties
#校验提示信息,items.name.length.error要写在java代码中
items.name.length.error=商品名称长度错误
校验bean
public class Items {
private Integer id;
//商品名称的长度请限制在1到30个字符
@Size(min=1,max=30,message="{items.name.length.error}")
private String name;
private Float price;
private String pic;
//请输入商品生产日期
//通过groups指定此校验属于哪个分组,可以指定多个分组
@NotNull(message="{items.createtime.is.notnull}")
private Date createtime;
controller中捕获错误
需要修改controller方法,在要校验的pojo前边加上@Validated
public String editItemSubmit(Model model,Integer id,
@Validated @ModelAttribute(value="itemsCustom") ItemsCustom itemsCustom,
BindingResult bindingResult
)throws Exception{
//输出校验错误信息
//如果参数绑定时有错
if(bindingResult.hasErrors()){
//获取错误
List<ObjectError> errors = bindingResult.getAllErrors();
//准备在页面输出errors,页面使用jstl遍历
model.addAttribute("errors", errors);
for(ObjectError error:errors){
//输出错误信息
System.out.println(error.getDefaultMessage());
}
//如果校验错误,回到商品修改页面
return "editItem";
}
注意:每个校验的pojo前面必须加@Validated,每个校验的pojo后面要加bindingResult接受校验错误信息
分组校验(常用)
需求:
针对不同的controller方法通过分组校验达到个性化校验的目的,修改商品修改功能,只校验生产日期不能为空。
第一步:创建分组接口
public interface ValidGroup1 {
//接口不定义方法,就是只标识 哪些校验 规则属于该 ValidGroup1分组
}
第二步:定义校验规则属于哪个分组
public class Items {
//请输入商品生产日期
//通过groups指定此校验属于哪个分组,可以指定多个分组
@NotNull(message="{items.createtime.is.notnull}",groups={ValidGroup1.class})
private Date createtime;
第三步:在controller方法定义使用校验的分组
//在@Validated中定义使用ValidGroup1组下边的校验
public String editItemSubmit(Model model,Integer id,
@Validated(value={ValidGroup1.class}) @ModelAttribute(value="itemsCustom") ItemsCustom itemsCustom,
BindingResult bindingResult
)throws Exception{
}