【SpringMVC學習06】SpringMVC中的數據校驗

這一篇博文主要總結一下springmvc中對數據的校驗。在實際中,通常使用較多是前端的校驗,比如頁面中js校驗,對於安全要求較高的建議在服務端也要進行校驗。服務端校驗可以是在控制層conroller,也可以是在業務層service,controller校驗頁面請求的參數的合法性,在服務端控制層conroller的校驗,不區分客戶端類型(瀏覽器、手機客戶端、遠程調用);service層主要校驗關鍵業務參數,僅限於service接口中使用的參數。這裏主要總結一下何如使用springmvc中controller的校驗。

1. 環境準備

  springmvc中我們使用hibernate的校驗框架validation(注:和hibernate沒有任何關係),使用這個校驗框架的話,需要導入jar包(下載地址),如下: 
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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

  配置規則就是bean和property屬性,別把class和文件名寫錯了就行,這裏有個配置是資源文件名,這個文件中我們將會配置一些錯誤信息。配置好了校驗器後,需要將校驗器注入到處理器適配器中,還是在springmvc.xml文件中,將我們配好的validator注入進去,如下: 
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對信用卡號進行一個大致的驗證
@Email被註釋的元素必須是電子郵箱地址
@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 {

    //接口中不需要定義任何方法,僅僅是對不同的校驗規則進行分組
    //此分組只校驗商品名稱的長度

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

  然後我們在剛剛的pojo中,添加這個分組,如下: 
分組校驗 
  再看一下想要校驗這個name字段的controller中是如何配置的: 
huoqu
  這樣該controller就不會去校驗生產日期的字段了,通過這種方式可以解決不同的controller校驗不同字段的問題。 
  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章