一、概述:
① 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 接口