.Net转Java自学之路—SpringMVC框架篇四(校验)
SpringMVC使用Hibernate的校验框架validation(和Hibernate没有关系)。
页面提交请求的参数,请求到Controller方法中,使用validation进行校验。除去使用校验Jar包外,还需要在SpringMVC.xml中来配置validation校验器。
<!-- 校验器,配置validator --> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <!--hibernate校验器--> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property> <!--指定校验使用的资源文件,在文件中配置校验的错误信息,若不指定则默认使用classpath下的ValidationMessage.peoperties--> <property name="validationMessageSource" ref="validationMessageSource"></property> </bean> <!-- 配置validationMessageSource 校验错误信息配置文件 --> <bean id="validationMessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <!-- 资源名称 指定校验信息的资源文件的基本文件名称,不包括后缀,后缀默认是properties --> <property name="basenames"> <list> <value>classpath:validationMessageSource</value> </list> </property> <!-- 指定文件的编码 --> <property name="fileEncodings" value="utf8"></property> <!-- 对资源文件内容缓存的时间,单位秒 --> <property name="cacheSeconds" value="120"></property> </bean>
将校验器注入到处理器适配器中
<mvc:annotation-driven conversion-service="conversionService" validator="validator"> </mvc:annotation-driven>
在validationMessageSource.properties中配置校验错误信息。如:
goods.name.size.msg=输入的名称长度在1到20个字符之间
goods.time.isNULL=时间不能为空
public class Goods{ @Size(min=1,max=20,message="{goods.name.size.msg}") private String name; @NotNull(message="{goods.time.isNULL}") private Date time; //GET/SET Code... }
捕获校验错误信息:
在需要校验的controller方法的形参pojo前加入@Validated,pojo后面添加BindingResult bindingResult接收校验出错信息。
注:@Validation和BindingResult是配对出现的。并且形参顺序是固定的。
public String edit(Model model,Integer id,@Validated GoodsCustom goodsCustom,BindingResult bindingResult) throws Exception{ //判断是否有错误信息 if(bindingResult.hasErrors()){ //输出错误信息 List<ObjectError> allerr = bindingResult.getAllErrors(); for(ObjectError oe : allerr){ //得到错误信息 oe.getDefaultMessage(); } } }
然后再controller方法中捕获的错误信息传到页面中
model.addAttribute("AllError",allerr);
分组校验:
在pojo中帝国一校验规则,而pojo是被多个controller所公用,当不同的controller方法对同一个pojo进行校验,但每个controller方法需要不同的校验规则。
综上所述,则需要定义多个校验分组(Java接口),分组中定义有校验规则。每个controller方法使用不同的校验分组。
public interface ValidatedGroupOne{ //接口中不需要定义任何方法,仅是对不同的校验规则进行分组 //如当前分组只校验名称长度 }
在校验规则中用groups指定此校验属于那个分组,groups可以定义多个分组。
public class Goods{ @Size(min=1,max=20,message="{goods.name.size.msg}",groups={ValidatedGroupOne.class}) private String name; @NotNull(message="{goods.time.isNULL}") private Date time; }
在controller方法中使用分组校验:@Validated(value={分组校验接口.class})指定使用那个分组的校验。
public String edit(Model model,Integer id,@Validated(value={ValidatedGroupOne.class}) GoodsCustom goodsCustom,BindingResult bindingResult) throws Exception{ }
一缕春风、一片绿荫