WebWork 2 (Struts 2 前身) 採用攔截器鏈架構,資料驗證同樣由攔截器實現。本文分析伺服端 ValidationInterceptor 與客戶端腳本驗證體系。
public class ValidationInterceptor extends AroundInterceptor {
protected void before(ActionInvocation invocation) throws Exception {
Action action = invocation.getAction();
String context = invocation.getProxy().getActionName();
ActionValidatorManager.validate(action, context); // 核心委派
}
protected void after(ActionInvocation dispatcher, String result) {}
}
validatorCache (Class+Context → Validator 清單)、validatorFileCache (驗證 XML 檔案時間戳)。ActionName-validation.xml。DelegatingValidatorContext (包裝 Action、提供錯誤訊息國際化、屬性存取)。Validator 清單,逐一呼叫 validator.validate(action)。ValidatorContext,最終拋出 ValidationException 或由 Result 處理。public static void validate(Object action, String context) throws ValidationException {
ValidatorContext ctx = new DelegatingValidatorContext(action);
validate(action, context, ctx);
}
public static void validate(Object action, String context, ValidatorContext ctx) throws ValidationException {
List validators = getValidators(action.getClass(), context); // 解析 XML + 快取
for (Validator v : validators) {
v.setValidatorContext(ctx);
v.validate(action); // 核心驗證邏輯
}
}
UserAction-validation.xml)<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN"
"https://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
<field name="email">
<field-validator type="requiredstring">
<message>Email 不能為空</message>
</field-validator>
<field-validator type="email">
<message>Email 格式錯誤</message>
</field-validator>
</field>
<field name="age">
<field-validator type="int">
<param name="min">18</param>
<param name="max">100</param>
<message>年齡需在 18-100 之間</message>
</field-validator>
</field>
</validators>
com.opensymphony.webwork.validators。ScriptValidationAware — 驗證器需實作以產出 JavaScript 程式碼片段。<ww:form>) 遍歷欄位驗證器 → 呼叫 getValidationScript() → 輸出內嵌 JS → 表單提交前瀏覽器端執行。Validator 介面 (或繼承 FieldValidatorSupport)。validators.xml (XWork 核心配置) 註冊 <validator name="customType" class="com.xxx.CustomValidator"/>。<field-validator type="customType">。ScriptValidationAware 並註冊至 WebWork validator 配置。DelegatingValidatorContext 結合 TextProvider 解析。short-circuit 屬性可在欄位首個驗證失敗時跳過後續驗證。