第五節(下):Struts2-校驗

一。說明

數據校驗,對客戶端訪問的參數進行數據校驗,如果請求數據類型無法轉換或不在合法範圍內都屬於數據校驗失敗。但在Struts2中數據類型轉換和合法性的校驗分別放在兩個部分(攔截器)執行。

請求首先通過類型轉換攔截器將參數賦值到Action屬性,再通過數據校驗方法對Action屬性進行合法性校驗。如果數據在類型轉換過程中失敗,依然會執行合法性校驗。

類型轉換和數據校驗過程中會將錯誤信息存放到fieldError對象中,Struts2另一個攔截器負責檢測fieldError對象中是否包含錯誤信息,如果包含則跳轉到INPUT所指定的物理頁面。

DTD文件地址已改變

舊地址:http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd

新地址:http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd

二。數據校驗的編寫方式分爲兩種:代碼方式與配置文件方式

代碼方式

重寫Aciton類的validate方法,對任何Action訪問均執行。

在方法內對數據進行合法校驗,並將錯誤信息保存到fieldError對象內。

編寫Action類的validateXxx方法,對xxx指定的訪問執行。xxx是配置action時的method值。

如果同時編寫validate與validateXxx方法,則執行順序爲先執行validateXxx後執行validate方法。如果action類存在繼承關係validate方法會被繼承下來並執行。

在校驗方法中通過addFieldError("標籤名","錯誤提示內容")來對fieldError對象進行操作,同時調用getText方法的話可以實現國際化提示信息功能。


Struts2的輸入校驗流程
1.類型轉換器負責對字符串的請求參數執行類型轉換,並將這些值設置成Action的屬性值。
2.在執行類型轉換過程中可能出現異常,如果出現異常,將異常信息保存到ActionContext
中,conversionError攔截器負責將其封裝到fieldError裏,然後執行第三步;如果轉換過
程沒有異常信息,則直接進去第三步。
3.通過反射調用validateXxx()方法,其中Xxx是即將處理用戶請求的處理邏輯所對應的方法
名。
4.調用Action類裏的validate()方法。
5.如果經過上面4步都沒有出現fieldError,將調用Action裏處理用戶請求的處理方法;如果
出現了fieldError,系統將轉入input邏輯視圖所指定的視圖資源。

配置文件方式

與Action中所有方法關聯的配置方式

編寫xml規則配置文件(參考以字段爲主語的配置方式、以規則爲主語的配置方式

命名規範:<Action類的名稱>-validation.xml

保存在與Action類同目錄下。

與Action中某一個方法關聯的配置方法

編寫xml規則配置文件(參考以字段爲主語的配置方式、以規則爲主語的配置方式

命名規範:<Action類的名稱>-<Action訪問名(配置Action的name名)>-validation.xml

保存在與Action類同目錄下。

執行順序:與代碼編寫同理。

情況一,爲loginAciton配置了loginAction-validation.xml併爲loginAction的login方法配置loginAction-login-validation.xml文件,執行順序如下。

1.loginAction-validation.xml

2.loginAction-login-validation.xml

情況二,爲父類baseAction配置了類校驗規則,父類baseAction的login方法配置了方法校驗規則。

       爲子類loginAction配置了類校驗規則,爲子類loginAction的login方法配置了方法校驗規則。

執行順序如下。

1.baseAction-validation.xml

2.baseAction-login-validation.xml

3.loginAction-validation.xml

4.loginAction-login-validation.xml

以字段爲主語的配置方式

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
	<field name="被校驗的字段名稱" short-circuit="true">
		<field-validator type="校驗規則名稱">
			<param name="參數名">參數值</param>
			<message key="國際化文件中的key,據說是不管用要通過OGNL表達式實現">校驗失敗後的提示信息(支持使用${getText("key")}實現國際化提示功能)</message>
		</field-validator>
	</field>
</validators>

以規則爲主語的配置方式

<validators>
	<validator type="校驗規則名" short-circuit="true">
		<param name="fieldName">需要被校驗的字段</param>
		<param name="參數名">參數值</param>
		<message key="國際化文件中的key,據說是不管用要通過OGNL表達式實現">校驗失敗後的提示信息(支持使用${getText("key")}實現國際化提示功能)</message>
	</validator>	
</validators>

短路的應用效果

當一個字段要滿足多個校驗規則時,第一個規則失敗後不去執行其他規則校驗。

在<field.../>和<validator.../>標籤中通過short-circuit控制。="true"表示短路 =“false”表示非短路。

短路的執行順序

1.所有以規則爲主語的校驗器優先於以字段爲主語的校驗器。

2.所有以規則爲主語的校驗器中,排在前面的會先執行。

3.所有以字段爲主語的校驗器中,排在前面的會先執行。

短路的規則

1.所有以規則爲主語的校驗器是最優先執行,如果某個以規則爲主語的校驗器校驗失敗了,則該字段上所有以字段爲主語的校驗器都不會執行。

2.以規則爲主語的校驗器失敗,不會阻止其他以規則爲主語的校驗器的執行。

3.如果一個以字段爲主語的校驗器失敗後,則該字段下的且排在該校驗失敗的校驗器之後的其他以字段爲主語的校驗器不會執行。

4.以字段爲主語的校驗器永遠都不會阻止以規則爲主語的校驗器。


內建校驗器功能說明(略...)







發佈了44 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章