.Net轉Java自學之路—SpringMVC框架篇四(校驗)

SpringMVC使用Hibernate的校驗框架validation(和Hibernate沒有關係)。spring

頁面提交請求的參數,請求到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

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

捕獲校驗錯誤信息:ide

  在須要校驗的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方法中捕獲的錯誤信息傳到頁面中spa

model.addAttribute("AllError",allerr);

分組校驗:hibernate

  在pojo中帝國一校驗規則,而pojo是被多個controller所公用,當不一樣的controller方法對同一個pojo進行校驗,但每一個controller方法須要不一樣的校驗規則。code

  綜上所述,則須要定義多個校驗分組(Java接口),分組中定義有校驗規則。每一個controller方法使用不一樣的校驗分組。xml

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{

}
相關文章
相關標籤/搜索