struts校驗主要是用于表單輸入的校驗,為action指定校驗規則,當校驗不通過時,将不執行action的目标方法,而是傳回input的結果。
為了良好的實作校驗,請讓Action繼承于ActionSupport
一、實作校驗的方式
1 指定類的校驗xml檔案
支援繼承,也支援對指定邏輯進行校驗,假如RegistAction繼承于BaseAction,此外BaseAction有login方法,那麼對于login方法,整個校驗的檔案搜尋順序如下:
BaseAction-validation.xml
BaseAction-login-validation.xml
RegistAction-validation.xml
RegistAction-login-validation.xml
如果全部存在,那麼上面的所有檔案的校驗規将都被執行。
配置檔案:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWrok Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<validators>
<!-- 校驗器的寫法分字段風格和非字段風格 -->
<!-- 字段風格的校驗*************************** -->
<field name="name">
<!-- 非空校驗 -->
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="name.required"></message>
<!-- key屬性是資源檔案中的鍵,屬于國際化的做法,另外也可以使用getText方法:
<message>${getText("name.required")}</message>
-->
</field-validator>
<!-- 正規表達式校驗 -->
<field-validator type="regex" >
<param name="expression"><![CDATA[(\w{4,25})]]></param>
<message key="name.length"></message>
</field-validator>
<!--
注:對于一個字段有多個校驗的情況,某些關鍵校驗可以設定short-circuit="true"來開啟短路特性。該特性将使得
目前校驗失敗的情況下終止後面關于該字段的字段風格校驗的執行。
-->
</field>
<field name="pass">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="pass.required"></message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,25})]]></param>
<message key="pass.length"></message>
</field-validator>
</field>
<field name="confirm">
<!-- 字段表達式校驗 -->
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[(pass==confirm)]]></param>
<message key="pass.confirm"></message>
</field-validator>
</field>
<field name="age">
<!-- 數值校驗 -->
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message key="age.range"></message>
</field-validator>
</field>
<!-- 非字段風格校驗 ************************-->
<!-- 日期校驗 -->
<validator type="date">
<param name="fieldName">birth</param>
<param name="min">1900-01-01</param>
<param name="max">2050-02-21</param>
<message key="birth.range"></message>
</validator>
<!-- 所有非字段風格的校驗都将優先于字段風格的校驗 -->
<!-- 短路校驗器如果在非字段風格校驗中,會被優先執行,如果是字段風格,則還是按順序來 -->
<!-- 短路校驗器的失敗會導緻後續關于該字段的字段風格校驗不執行,而對于非字段風格的校驗則無影響 -->
</validators>
2 使用注解
@RequiredStringValidator(type=ValidatorType.FIELD,key="name.required", message="")
public void setName(String name)...
更多參考:
http://struts.apache.org/2.2.3/docs/validation-annotation.html3 覆寫ActionSupport的validate方法或validateXXX方法
對于後者,如果調用的方法是login那麼就為validateLogin方法。
這兩者中validate會先被調用,validateXXX在後面被調用。
在重寫的方法中,可以調用ActionSupport提供的便利方法如:
addFieldError("user","使用者名稱輸入不正确"); --- 添加一條校驗錯誤,一旦執行過這樣的操作,便表示校驗未通過(傳回結果input)
getText("user.required")根據key擷取資源檔案的内容
二、關于校驗過程的描述
1 類型轉換,如果出錯,将錯誤資訊儲存到ActionContext裡,由conversionError攔截器負責将其轉換為fieldError,然後繼續執行校驗;否則直接進入校驗過程
2 配置檔案校驗 -> 注解校驗
3 執行validate
4 執行validateXXX
5 判斷是否存在fieldError,如果有則傳回input結果,否則調用action的目标方法
6 處理結果..
三、關于内建校驗器
conversion validator
date validator
double validator
email validator
expression validator
fieldexpression validator
int validator
regex validator
required validator
requiredstring validator
stringlength validator
url validator
visitor validator
參考:
http://struts.apache.org/2.2.3/docs/validation.html#Validation-RegisteringValidators四、關于用戶端校驗
用戶端校驗即是struts通過擷取服務端action的校驗配置自動在jsp頁面中生成校驗的js代碼的功能。
由于興趣原因,試驗了一下用戶端校驗,發現這部分功能就是雞肋..:
用的是2.3.3版本,用戶端校驗的實作過程如下:
1 使用<s:form>要求設定屬性 validate為"true",内部的表單元素一律采用struts的标簽
2 jsp頁面不能是直接通路,否則會報異常(NullPointer之類..),需要通過action映射到jsp資源:
<action name="*"><result>/{1}.jsp</result>
3 <s:form>的action必須是action的名稱,而不能是**.action 否則會直接送出給背景action驗證;
4 在<head>内加入<s:head/>可以看到一點點css效果。
用後感覺:功能太弱,容易出錯;許多校驗器都支援不了;出錯情況下再次送出出錯會顯示重複的錯誤提示(上次送出的錯誤提示并未消除)
最好的資源來自官方文檔:
http://struts.apache.org/2.2.3/docs/validation.html
作者:
zale出處:
http://www.cnblogs.com/littleatp/, 如果喜歡我的文章,請
關注我的公衆号本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出
原文連結如有問題, 可留言咨詢.