Struts 2 的函數驗證建立在 ActionSupport 實現的 ValidationAware 接口之上,提供兩級錯誤收集:
Map<String, List<String>>,綁定具體屬性名,頁面可用 <s:fielderror fieldName="xxx"> 定點顯示。Collection<String>,無屬性綁定,頁面需用 <s:actionerror> 統一顯示(預設 ul 列表)。input。validate()、validate{MethodName}()、XML 驗證;過程中調用 addFieldError()/addActionError() 記錄錯誤。ValidationAware.hasErrors() 檢查兩個容器是否為空 → 空則調用 execute()(或指定 method)進入業務邏輯 → 非空直接返回 input 結果碼。struts.xml 中 <result name="input"> 通常映射回輸入頁面,錯誤訊息自動回顯。<action name="UserAction" class="com.demo.UserAction" method="register">
<result>/success.jsp</result>
<result name="input">/register.jsp</result>
</action>
public String register() { /* 業務邏輯 */ return SUCCESS; }
public void validateRegister() { /* register 專用驗證 */ }
// 通用驗證(所有方法前執行)
public void validate() { /* 共用驗證邏輯 */ }
執行順序: validateRegister() → validate() → XML 驗證。
實現原理: Java 反射動態查找方法,**效能稍低,無特殊需求請優先使用 XML 驗證**。
<!-- struts.xml -->
<constant name="struts.custom.i18n.resources" value="message"/>
# message.properties
xwork.default.invalid.fieldvalue={0} 輸入格式錯誤
在 Action 同包目錄建立 ActionName.properties:
# UserAction.properties
invalid.fieldvalue.username=用戶名只能包含字母數字
invalid.fieldvalue.email=郵箱格式不正確
<s:form action="UserAction_register">
<s:textfield name="username" label="用戶名"/>
<s:fielderror fieldName="username"/> <!-- 顯示該字段錯誤 -->
<s:textfield name="email" label="郵箱"/>
<s:fielderror fieldName="email"/>
<s:actionerror/> <!-- 顯示所有 Action 級錯誤 -->
<s:submit value="註冊"/>
</s:form>
validate(),方法專用放入 validateXxx()。<result name="input">,否則驗證失敗會拋 404。VisitorFieldValidator 級聯驗證嵌套物件,避免重複定義。