Struts 2 的驗證核心在於 ActionSupport 實作了 Validateable 介面,提供 validate() 生命週期方法。框架在呼叫 execute() 前自動調用 validate(),若發現錯誤 (透過 addFieldError / addActionError 記錄),則中斷執行並導向 input 結果頁面。
public class UserAction extends ActionSupport {
private User user; // 模型驅動
@Override
public void validate() {
// 欄位級驗證
if (user.getUsername() == null || user.getUsername().length() < 4) {
addFieldError("username", "用戶名長度至少 4 字元");
}
// 物件級驗證 (跨欄位)
if (!user.getPassword().equals(user.getConfirmPassword())) {
addActionError("兩次密碼輸入不一致");
}
}
public String execute() { return SUCCESS; }
// getter/setter
}
struts.xml 關鍵配置: 必須為 Action 定義 name="input" 的 <result>,指向回顯表單的頁面。
建立 Action類名-validation.xml 放在同包目錄下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
"https://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<!-- 欄位驗證器 -->
<field name="username">
<field-validator type="requiredstring">
<message>用戶名不可為空</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">20</param>
<message>用戶名長度需在 ${minLength}-${maxLength} 之間</message>
</field-validator>
</field>
<field name="email">
<field-validator type="email">
<message>Email 格式不正確</message>
</field-validator>
</field>
<!-- 非欄位驗證器 (跨欄位/運算式) -->
<validator type="fieldexpression">
<param name="expression">password == confirmPassword</param>
<message>密碼與確認密碼不一致</message>
</validator>
<!-- Visitor 驗證 (巢狀物件) -->
<field name="userProfile">
<field-validator type="visitor">
<param name="context">profileContext</param>
<param name="appendPrefix">true</param>
<message>個人資料:</message>
</field-validator>
</field>
</validators>
巢狀物件 UserProfile 需建立 UserProfile-profileContext-validation.xml。
解決方案:在 struts.xml 全域切換 Simple 主題,或頁面單獨指定:
<constant name="struts.ui.theme" value="simple" />
<!-- 或頁面標籤 -->
<s:form theme="simple" ...>
Simple 主題不輸出多餘 HTML,完全由開發者控制版面。
<!-- Action 級錯誤 (全域) -->
<s:actionerror cssClass="alert alert-danger" />
<!-- Field 級錯誤 (單欄位) -->
<s:textfield name="username" label="用戶名" />
<s:fielderror fieldName="username" cssClass="text-danger" />
<!-- 手動取得特定欄位第一條錯誤 -->
<s:property value="fieldErrors['username'][0]" />
validate() 程式碼驗證input 結果execute()Struts 2 提供程式碼與 XML 雙軌驗證,建議:簡單規則用 XML (可複用、支援國際化),複雜業務邏輯用程式碼。搭配 Simple 主題與 <s:fielderror> 客製化顯示,能構建體驗良好的表單驗證體系。