.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{

}

猜你喜欢

转载自www.cnblogs.com/zltao/p/10665620.html