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