Struts 2 提供基於 XML 的聲明式驗證框架,將驗證邏輯從 Action 代碼中剝離,實現「配置而非編碼」。驗證檔案命名約定:Action類名-validation.xml 或 Action類名-方法名-validation.xml,置於 Action 同包目錄下。
<!ELEMENT validators (field | validator)+>
<!ELEMENT field (field-validator+)>
<!ATTLIST field name CDATA #REQUIRED>
<!ELEMENT field-validator (param*, message)>
<!ATTLIST field-validator type CDATA #REQUIRED; short-circuit (true|false) "false">
<!ELEMENT validator (param*, message)>
<!ATTLIST validator type CDATA #REQUIRED; short-circuit (true|false) "false">
<!ELEMENT param (#PCDATA)>
<!ATTLIST param name CDATA #REQUIRED>
<!ELEMENT message (#PCDATA)>
<!ATTLIST message key CDATA #IMPLIED>
根元素 <validators> 下可包含兩類子元素:
<validators>
<field name="username">
<field-validator type="requiredstring">
<message key="error.username.required"/>
</field-validator>
</field>
<field name="password">
<field-validator type="stringlength">
<param name="trim">true</param>
<param name="minLength">4</param>
<param name="maxLength">10</param>
<message>密碼長度必須在 ${minLength} 到 ${maxLength} 之間</message>
</field-validator>
</field>
</validators>
com.opensymphony.xwork2.validator.validators.default.xml,映射驗證器名稱到實作類。常用內建驗證器:| type 名稱 | 實作類 | 用途 |
|---|---|---|
| requiredstring | RequiredStringValidator | 非空且非空白字串 |
| stringlength | StringLengthFieldValidator | 字串長度範圍(支援 trim/minLength/maxLength) |
| int / double / date | IntRangeFieldValidator 等 | 數值/日期範圍 |
| email / url | EmailValidator / URLValidator | 格式驗證 |
| regex | RegexFieldValidator | 正則表達式 |
| fieldexpression | FieldExpressionValidator | 多字段關聯比較(OGNL 表達式) |
| visitor | VisitorFieldValidator | 級聯驗證嵌套物件 |
| conversion | ConversionErrorFieldValidator | 類型轉換錯誤捕獲 |
StringLengthFieldValidator 定義了 trim、minLength、maxLength 三個屬性及 setter。<message>。${minLength}。key 屬性指向國際化資源檔鍵值。addFieldError(fieldName, msg) 註冊,頁面用 <s:fielderror> 顯示。適用於多字段共用同一驗證規則(如「用戶名、密碼、確認密碼」皆非空)。
<validators>
<validator type="requiredstring" short-circuit="true">
<param name="fieldName">username</param>
<param name="fieldName">password</param>
<param name="fieldName">password_confirmed</param>
<message key="error.field.required"/>
</validator>
<validator type="stringlength">
<param name="trim">true</param>
<param name="minLength">4</param>
<param name="maxLength">10</param>
<param name="fieldName">password</param>
<param name="fieldName">password_confirmed</param>
<message>密碼長度必須在 ${minLength} 到 ${maxLength} 之間</message>
</validator>
</validators>
差異總結: 字段驗證「先定字段,再定驗證器」;全局驗證「先定驗證器,再列字段」。兩種可混用。
method="newExecute" 時,驗證檔命名為 Action-newExecute-validation.xml。Action-validation.xml 會額外執行(疊加)。<s:form validate="true"> 啟用,生成 JavaScript 驗證碼。