轉自:http://blog.csdn.net/eson_15/article/details/51725470
這一篇博文主要總結一下springmvc中對數據的校驗。在實際中,通常使用較多是前端的校驗,比如頁面中js校驗,對於安全要求較高的建議在服務端也要進行校驗。服務端校驗可以是在控制層conroller,也可以是在業務層service,controller校驗頁面請求的參數的合法性,在服務端控制層conroller的校驗,不區分客戶端類型(瀏覽器、手機客戶端、遠程調用);service層主要校驗關鍵業務參數,僅限於service接口中使用的參數。這里主要總結一下何如使用springmvc中controller的校驗。
1. 環境准備
springmvc中我們使用hibernate的校驗框架validation(注:和hibernate沒有任何關系),使用這個校驗框架的話,需要導入jar包(下載地址),如下:
2. 配置校驗器
在springmvc.xml配置文件中配置一下校驗器,如下:
<!-- 配置校驗器 --> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <!-- 校驗器,使用hibernate校驗器 --> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> <!-- 指定校驗使用的資源文件,在文件中配置校驗錯誤信息,如果不指定則默認使用classpath下面的ValidationMessages.properties文件 --> <property name="validationMessageSource" ref="messageSource"/> </bean> <!-- 校驗錯誤信息配置文件 --> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <!-- 資源文件名 --> <property name="basenames"> <list> <value>classpath:CustomValidationMessage</value> </list> </property> <!-- 資源文件編碼格式 --> <property name="fileEncodings" value="utf-8"/> <!-- 對資源文件內容緩存時間,單位秒 --> <property name="cacheSeconds" value="120"/> </bean>
配置規則就是bean和property屬性,別把class和文件名寫錯了就行,這里有個配置是資源文件名,這個文件中我們將會配置一些錯誤信息。配置好了校驗器后,需要將校驗器注入到處理器適配器中,還是在springmvc.xml文件中,將我們配好的validator注入進去,如下:
這樣校驗器就配置好了。
3. 在pojo中添加校驗
hibernate校驗框架提供了很多注解校驗,我先簡單羅列一下:
注解 | 運行時檢查 |
---|---|
@AssertFalse | 被注解的元素必須為false |
@AssertTrue | 被注解的元素必須為true |
@DecimalMax(value) | 被注解的元素必須為一個數字,其值必須小於等於指定的最小值 |
@DecimalMin(Value) | 被注解的元素必須為一個數字,其值必須大於等於指定的最小值 |
@Digits(integer=, fraction=) | 被注解的元素必須為一個數字,其值必須在可接受的范圍內 |
@Future | 被注解的元素必須是日期,檢查給定的日期是否比現在晚 |
@Max(value) | 被注解的元素必須為一個數字,其值必須小於等於指定的最小值 |
@Min(value) | 被注解的元素必須為一個數字,其值必須大於等於指定的最小值 |
@NotNull | 被注解的元素必須不為null |
@Null | 被注解的元素必須為null |
@Past(java.util.Date/Calendar) | 被注解的元素必須過去的日期,檢查標注對象中的值表示的日期比當前早 |
@Pattern(regex=, flag=) | 被注解的元素必須符合正則表達式,檢查該字符串是否能夠在match指定的情況下被regex定義的正則表達式匹配 |
@Size(min=, max=) | 被注解的元素必須在制定的范圍(數據類型:String, Collection, Map and arrays) |
@Valid | 遞歸的對關聯對象進行校驗, 如果關聯對象是個集合或者數組, 那么對其中的元素進行遞歸校驗,如果是一個map,則對其中的值部分進行校驗 |
@CreditCardNumber | 對信用卡號進行一個大致的驗證 |
被注釋的元素必須是電子郵箱地址 | |
@Length(min=, max=) | 被注解的對象必須是字符串的大小必須在制定的范圍內 |
@NotBlank | 被注解的對象必須為字符串,不能為空,檢查時會將空格忽略 |
@NotEmpty | 被注釋的對象必須為空(數據:String,Collection,Map,arrays) |
@Range(min=, max=) | 被注釋的元素必須在合適的范圍內 (數據:BigDecimal, BigInteger, String, byte, short, int, long and 原始類型的包裝類 ) |
@URL(protocol=, host=, port=, regexp=, flags=) | 被注解的對象必須是字符串,檢查是否是一個有效的URL,如果提供了protocol,host等,則該URL還需滿足提供的條件 |
上面我簡單羅列了一些校驗的注解,不同的注解的具體使用方法可以參考官方文檔或者網上資料,這里我選擇兩個注解來說明如何使用這個hibernate驗證框架。首先在自己的pojo中需要驗證的屬性上添加相應的驗證注解:
我們看到注解中可以指定message,那么這個message中的內容是錯誤消息配置文件中對應的key,取出來的就是對應的錯誤消息,所以針對這兩個錯誤消息,我們寫一下配置文件:
4. 捕獲校驗錯誤信息
上面已經將校驗相關的配置都配好了,接下來就需要在controller的方法中捕獲校驗結果中的錯誤信息,然后將這些錯誤信息傳到前台去顯示。那么controller的方法中該如何去捕獲呢?如下:
可以看出,在需要校驗的pojo前邊添加@Validated,在需要校驗的pojo后邊添加BindingResult bindingResult來接收校驗出錯信息。值得注意的是:@Validated和BindingResult bindingResult是配對出現,並且形參順序是固定的(一前一后)。這樣就可以順利接收到錯誤信息了。關於前台的東西,我就不寫了。
5. 分組校驗
上面已經能完成springmvc的校驗功能了,但是有個問題:剛剛是在pojo中定義了校驗規則,但是pojo是被多個controller使用的,現在假如兩個不同的controller使用的校驗規則是不一樣的,簡單來說,一個controller不需要去校驗生產日期,只要校驗一下商品名稱即可,另一個controller兩個都要校驗,這樣就沒法做了,因為兩個controller都使用同一個pojo。
為了解決這個問題,我們可以定義多個校驗分組(其實是一個Java接口),分組中定義有哪些規則,每個controller方法使用不同的校驗分組即可。看一下下面的例子就明白了:
首先定義一個校驗分組:
public interface ValidGroup1 { //接口中不需要定義任何方法,僅僅是對不同的校驗規則進行分組 //此分組只校驗商品名稱的長度 }
然后我們在剛剛的pojo中,添加這個分組,如下:
再看一下想要校驗這個name字段的controller中是如何配置的:
這樣該controller就不會去校驗生產日期的字段了,通過這種方式可以解決不同的controller校驗不同字段的問題。