Strus2(十三)---輸入驗證

(1)struts2的輸入驗證
—基於Xwork Validation Framework的聲明式驗證,需要聲明的內容包括
~~對哪個Action或Model的哪個字段進行驗證;
~~使用什麼驗證規則;
~~如果驗證失效,轉向哪一個頁面,顯示是什麼錯誤消息;
—編程式驗證
~~可以使Action類實現Validateable接口,ActionSupport類已經實現了Validateable接口;
(2)聲明式驗證
—字段驗證:判斷某個字段屬性的輸入是否有效.
—非字段驗證:不只針對某個字段,而是針對多個字段的輸入值之間的邏輯關係進行校驗.例如:對再次輸入密碼進行判斷.
—使用聲明式驗證程序的步驟:
I 先明確對哪一個Action的哪一個字段進行驗證.
II 編寫配置文件.它的文件名必須是以下兩種格式之一:
· 若一個Action類的多個action使用同樣的驗證規則:ActionClassName-validation.xml;
· 若一個Action的多個action使用不同的驗證規則:ActionClassName-AliasName(即action的請求名)-validation.xml

例:
這裏寫圖片描述
III 確定驗證失敗時的響應頁面:在struts.xml文件中定義一個<result name="input">的元素。 (若驗證失敗,則轉向input的那個result,所以需要配置name=”input”的result)
(3)Struts2內置的驗證規則及作用:
這裏寫圖片描述

· required: 確保某給定字段的值不是空值 null .

· requiredstring: 確保某給定字段的值既不是空值 null, 也不是空白.

  • trim 參數. 默認爲 true, 表示 struts 在驗證該字段值之前先剔除前後空格.

· stringlength: 驗證一個非空的字段值是不是有足夠的長度.

  • minLength: 相關字段的最小長度. 若沒有給出這個參數, 該字段將沒有最小長度限制 .
  • maxLength:相關字段的最大長度. 若沒有給出這個參數, 該字段將沒有最大長度限制.
  • trim: 在驗證之前是否去除前後空格

· date: 確保某給定日期字段的值落在一個給定的範圍內

  • max:相關字段的最大值. 若沒給出這個參數, 該字段將沒有最大值限制.
  • min:相關字段的最小值. 若沒給出這個參數, 該字段將沒有最小值限制.

· email: 檢查給定 String 值是否是一個合法的 email.
· url: 檢查給定 String 值是否是一個合法的 url.
· regex: 檢查某給定字段的值是否與一個給定的正則表達式模式相匹配.

  • expresssion*: 用來匹配的正則表達式.
  • caseSensitive: 是否區分字母的大小寫. 默認爲 true.
  • trim: 是否去除前後空格. 默認爲 true.

· int: 檢查給定整數字段值是否在某一個範圍內.

  • min: 相關字段的最小值. 若沒給出這個參數, 該字段將沒有最小值限制.
  • max: 相關字段的最大值. 若沒給出這個參數, 該字段將沒有最大值限制.

· conversion: 檢查對給定 Action 屬性進行的類型轉換是否會導致一個轉換錯誤. 該驗證程序還可以在默認的類型轉換消息的基礎上添加一條自定義的消息.
· expression 和 fieldexpression: 用來驗證給定字段是否滿足一個 OGNL 表達式.

  • 前者是一個非字段驗證程序, 後者是一個字段驗證程序.
  • 前者在驗證失敗時將生成一個 action 錯誤, 而後者在驗證失敗時會生成一個字段錯誤.
  • expression*: 用來進行驗證的 OGNL 表達式.
    例:
    這裏寫圖片描述

(4)聲明式驗證的配置文件內容:
這裏寫圖片描述
~~自定義驗證程序的出錯消息的國際化配置

<message key="error.int"></message>
//再在國際化配置文件中加入一個鍵值對:error.int = 自定義的消息

(5)如何顯示錯誤消息?
–若使用的是非simple主題,則自動顯示錯誤消息.
–若使用的是simple主題,則需要使用s:fielderror標籤或直接使用EL表達式(使用OGNL);
例:

${fieldErrors.age[0]} OR <s:fielderror fieldName="age"/>

(6)聲明式驗證框架的原理
~~Struts2默認的攔截器棧中提供了一個Validation攔截器.
~~每個具體的驗證規則都會對應一個具體的攔截器.有一個配置文件把驗證規則名稱和驗證器關聯起來了,而實際上關聯的是那個驗證器,該文件位於com.opensymphony.xwork2.validator.validators下的default.xml
這裏寫圖片描述
這裏寫圖片描述

(7)短路驗證器
~~若一個字段使用多個驗證器,默認情況下會執行所有的驗證,若希望前面的驗證沒有通過,後面的就不在驗證,可以使用短路驗證.<validator .../>元素和<field-validator .../>元素可以指定一個可選的short-circuit屬性,該屬性指定該驗證器是否是短路驗證器,默認值是false.

<!-- 設置短路驗證: 若當前驗證沒有通過, 則不再進行下面的驗證 -->
        <field-validator type="conversion" short-circuit="true">
            <message>^Conversion Error Occurred</message>
        </field-validator>
//注: 若類型轉換失敗, 默認情況下還會執行後面的攔截器, 還會進行 驗證. 可以通過修改 ConversionErrorInterceptor 源代碼的方式使當類型轉換失敗時, 不再執行後續的驗證攔截器, 而直接返回 input 的 result
    Object action = invocation.getAction();
        if (action instanceof ValidationAware) {
            ValidationAware va = (ValidationAware) action;

            if(va.hasFieldErrors() || va.hasActionErrors()){
                return "input";
            }
        }

(8)關於非字段驗證: 不是針對於某一個字段的驗證.

<validator type="expression">
        <param name="expression"><![CDATA[password==password2]]></param>
        <message>Password is not equals to password2</message>
    </validator>
  //顯示非字段驗證的錯誤消息, 使用 s:actionerror 標籤:  <s:actionerror/>  

(9)錯誤消息的重用性:即多個字段使用同樣的驗證規則,適用同一條驗證消息

error.int=${getText(fieldName)} needs to be between ${min} and ${max}

age=\u5E74\u9F84
count=\u6570\u91CF  

具體分析:
這裏寫圖片描述
(10) 自定義驗證器:

I. 定義一個驗證器的類

> 自定義的驗證器都需要實現 Validator. 
> 可以選擇繼承 ValidatorSupport 或 FieldValidatorSupport 類
> 若希望實現一個一般的驗證器, 則可以繼承 ValidatorSupport
> 若希望實現一個字段驗證器, 則可以繼承 FieldValidatorSupport

> 具體實現可以參考目前已經有的驗證器. 

> 若驗證程序需要接受一個輸入參數, 需要爲這個參數增加一個相應的屬性

II. 在配置文件中配置驗證器

> 默認情況下下, Struts2 會在 類路徑的根目錄下加載 validators.xml 文件. 在該文件中加載驗證器.
     該文件的定義方式同默認的驗證器的那個配置文件: 位於 com.opensymphony.xwork2.validator.validators 下的 default.xml

> 若類路徑下沒有指定的驗證器, 則從 com.opensymphony.xwork2.validator.validators 下的 default.xml 中的驗證器加載     

III. 使用: 和目前的驗證器一樣.
(11)編程式驗證
· Struts2 提供了一個 Validateable 接口, 可以使 Action 類實現這個接口以提供編程驗證功能.
· ActionSupport 類已經實現了 Validateable 接口
這裏寫圖片描述

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