天天看點

Struts2的輸入驗證

一、概述:

① Struts2 的輸入驗證 – 基于 XWork Validation Framework 的 聲明式驗證 : Struts2 提供了一些 基于 XWork Validation Framework 的 内建驗證 程式 . 使用這些驗證程式不需要程式設計 , 隻要在一個 XML 檔案裡對驗證程式應該如何工作作出聲明就可以了 . 需要聲明的内容包括 :   • 哪些 字段需要進行 驗證   • 使用什麼驗證規則   • 在 驗證失敗時應該把什麼樣的出錯消息發送到浏覽器端 – 程式設計驗證:通過 編寫代碼來驗證使用者 輸入 二、Struts2的聲明式驗證:

①  聲明式驗證 程式可以分為兩類 : – 字段驗證 :  判斷某個字段屬性的輸入是否有效 – 非字段驗證 :   不隻針對某個字段,而是針對多個字段的輸入值之間的邏輯關系進行校驗。例如:對再次輸入密碼的判斷。 ②  使用 一 個聲明式驗證 程式需要 3 個步驟 :       – 1. 确定哪些 Action 字段需要 驗證       – 2. 編寫一個驗證程式配置檔案 . 它的檔案名必須是以下兩種格式之一 :             • 若一個 Action 類的多個 action 使用同樣的驗證規則 : ActionClassName-validation.xml             • 若一個 Action 類的多個 action 使用不同的驗證規則 : ActionClass-alias-validation.xml , 例如 UserAction- User_create -validation.xml       – 3. 确定驗證失敗 時的響應頁面 : 在 struts.xml 檔案中定義一個 <result name=“input”> 的元素 .

③ Struts2的一些内建驗證規則:

      • conversion validator :轉換驗證器       • date validator :日期驗證器       • double validator :浮點驗證器       • email validator : email 驗證器       • expression validator :表達式驗證器       • fieldexpression validator :字段表達式驗證器       • int validator :整型驗證器       • regex validator :正規表達式驗證器       • required validator :非空驗證器       • requiredstring validator :非空字元串驗證器       • stringlength validator :字元串長度驗證器       • url validator : url 格式驗證器      • visitor validator :複合屬性驗證器 ④  一個簡單的字段驗證聲明:

<!-- 待驗證字段名稱為username -->
    <field name="username">
        <!-- 使用非空驗證器 -->
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <!-- 錯誤提示消息 -->
            <message>必須輸入使用者名</message>
        </field-validator>
        <!-- 使用正則驗證器 -->
        <field-validator type="regex">
            <param name="expression"><![CDATA[(\w{6,20})]]></param>
            <message>使用者名長度必須在6到20字元之間</message>
        </field-validator>
    </field>
           

⑤ 顯示錯誤消息

  a、若使用的是struts2的非simple主題,則自動顯示錯誤消息

  b、若使用的是simple主題,則需要 s:fielderror 标簽或直接使用 EL 表達式(使用 OGNL)

    ${fieldErrors.age[0] }

     或者

    <s:fielderror fieldName="age"></s:fielderror>   推薦使用此方法

⑥  Struts2聲明式驗證的原理:

     > Struts2 預設的攔截器棧中提供了一個 validation 攔截器

     > 每個具體的驗證規則都會對應具體的一個驗證器. 有一個配置檔案把驗證規則名稱和驗證器關聯起來了. 而實際上驗證的是那個驗證器.

        該檔案位于 com.opensymphony.xwork2.validator.validators 下的 default.xml

        <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>

⑦  短路驗證

     若對一個字段使用多個驗證器, 預設情況下會執行所有的驗證. 若希望前面的驗證器驗證沒有通過, 後面的就不再驗證, 可以使用短路驗證

    <validator …/>元素和 <field-validator …/>元素可以指定一個可選的 short-circuit屬性,該屬性指定該驗證器是否是短驗證器,預設值為false。

<!-- 設定短路驗證: 若目前驗證沒有通過, 則不再進行下面的驗證 -->
		<field-validator type="conversion" short-circuit="true">
			<message>Conversion Error Occurred</message>
		</field-validator>

		<field-validator type="int">
			<param name="min">20</param>
			<param name="max">60</param>
			<message key="error.int"></message>
		</field-validator>
           

⑧  不同的字段使用同樣的驗證規則, 而且使用同樣的響應消息 ?

将錯誤消息配置在國際化資源檔案中:

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

age=年齡

count=數量

⑨  自定義驗證器:

I.   定義一個驗證器的類

    > 自定義的驗證器都需要實作 Validator.

    > 可以選擇繼承 ValidatorSupport 或 FieldValidatorSupport 類

    > 若希望實作一個一般的驗證器, 則可以繼承 ValidatorSupport

    > 若希望實作一個字段驗證器, 則可以繼承 FieldValidatorSupport

    > 若驗證程式需要接受一個輸入參數, 需要為這個參數增加一個相應的屬性,并提供對應的setter與getter方法

public class IDCardValidator extends FieldValidatorSupport {

	@Override
	public void validate(Object object) throws ValidationException {
		//1. 擷取字段的名字和值
		String fieldName = getFieldName();
        Object value = this.getFieldValue(fieldName, object);
        
		//2. 驗證
		IDCard idCard = new IDCard();
		boolean result = idCard.Verify((String)value);
        
		//3. 若驗證失敗, 則 ...
		if(!result){
			addFieldError(fieldName, object);
		}
		
	}

}
           

II.  在配置檔案中配置驗證器

    > 預設情況下下, Struts2 會在 類路徑的根目錄下加載 validators.xml 檔案. 在該檔案中加載驗證器.

         該檔案的定義方式同預設的驗證器的那個配置檔案: 位于 com.opensymphony.xwork2.validator.validators 下的 default.xml

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

III. 使用: 和目前的驗證器一樣.

三、Struts2的程式設計式驗證

Struts2 提供了一個 Validateable 接口 , 可以 使 Action 類 實作這個接口以提供程式設計驗證功能 . ActionSupport   類 已經實作了 Validateable 接口

繼續閱讀