Struts2 提供兩種驗證方式,可混合使用:
validate() / validateXxx() 方法驗證失敗自動返回 input 結果,錯誤信息存入 fieldErrors,頁面通過 <s:fielderror/> 顯示。
validate()
public class UserAction extends ActionSupport {
private String username;
private String password;
public String login() { return SUCCESS; }
public String register() { return SUCCESS; }
// 所有 Action 方法執行前調用
@Override
public void validate() {
if (StringUtils.isBlank(username)) {
addFieldError("username", "用戶名不能為空");
}
if (StringUtils.isBlank(password)) {
addFieldError("password", "密碼不能為空");
} else if (password.length() < 6) {
addFieldError("password", "密碼長度至少 6 位");
}
}
// 特定方法驗證:validate + 方法名(首字母大寫)
public void validateRegister() {
validate(); // 復用通用邏輯
if (!password.equals(confirmPassword)) {
addFieldError("confirmPassword", "兩次密碼不一致");
}
}
}
<package name="default" extends="struts-default">
<action name="userLogin" class="com.example.UserAction" method="login">
<result name="success">/welcome.jsp</result>
<result name="input">/login.jsp</result> <!-- 驗證失敗跳轉 -->
</action>
<action name="userRegister" class="com.example.UserAction" method="register">
<result name="success">/success.jsp</result>
<result name="input">/register.jsp</result>
</action>
</package>
<!-- login.jsp -->
<s:form action="userLogin">
<s:textfield name="username" label="用戶名"/>
<s:password name="password" label="密碼"/>
<s:fielderror /> <!-- 顯示所有字段錯誤 -->
<s:submit value="登錄"/>
</s:form>
Action類名-validation.xmlAction類名-方法名-validation.xmlvalidate() 方法
<?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">3</param>
<param name="maxLength">20</param>
<message>用戶名長度 3-20 位</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<message>密碼不能為空</message>
</field-validator>
<field-validator type="regex">
<param name="expression">^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,}$</param>
<message>密碼需含字母數字,至少 6 位</message>
</field-validator>
</field>
<field name="email">
<field-validator type="email">
<message>郵箱格式不正確</message>
</field-validator>
</field>
</validators>
<validators>
<validator type="expression">
<param name="expression">password == confirmPassword</param>
<message>兩次密碼輸入不一致</message>
</validator>
<validator type="fieldexpression">
<param name="fieldName">age</param>
<param name="expression">age >= 18 && age <= 100</param>
<message>年齡必須在 18-100 之間</message>
</validator>
</validators>
| 類型 | 驗證器 | 關鍵參數 | 說明 |
|---|---|---|---|
| 基礎 | required | — | 非 null(字符串允許空串) |
| requiredstring | trim (true/false) | 非 null 且 trim 後非空 | |
| stringlength | minLength, maxLength, trim | 長度範圍 | |
| 格式 | — | 郵箱格式 | |
| url | — | URL 格式 | |
| regex | expression, caseSensitive | 正則表達式 | |
| date | min, max, format | 日期範圍 | |
| 數值 | int | min, max | 整數範圍 |
| double | min, max | 浮點範圍 | |
| long | min, max | 長整數範圍 | |
| 業務 | expression | expression (OGNL) | 任意 OGNL 表達式 |
| 業務 | fieldexpression | fieldName, expression | 字段級 OGNL 表達式 |
| 組合 | visitor | context, appendPrefix | 驗證嵌套對象(遞歸) |
| 轉換 | conversion | — | 類型轉換錯誤捕獲 |
# UserAction.properties
username.requiredstring = 用戶名不能為空
password.stringlength = 密碼長度必須在 ${minLength}-${maxLength} 之間
email.email = 請輸入合法的郵箱地址
XML 中使用 Key:
<message key="username.requiredstring"/>
validateXxx() 或 expression:XML 表達能力有限conversion 驗證器捕獲 NumberFormatException 等Struts2 雙軌驗證機制兼顧了編程靈活性與聲明式簡潔性。通用邏輯用 XML,業務定製用 validateXxx(),配合完善的國際化消息體系,構建健壯的表單防護層。現代項目多遷移至 Spring MVC + Bean Validation (JSR-380),但理解 Struts2 驗證原理有助於掌握 MVC 框架驗證設計精髓。