數據驗證是 Web 應用安全與用戶體驗的第一道防線。Struts2 提供手動驗證(Action 方法中編碼邏輯)與聲明式驗證(XML/註解)兩種模式。本文以用戶提交姓名年齡為例,完整演示手動驗證流程:Action 中調用 addFieldError 記錄錯誤、返回 `ERROR` 結果、JSP 中用 `
<form action="${pageContext.request.contextPath}/user/user!check" method="post">
姓名: <input type="text" name="user.name" /><br/>
年齡: <input type="text" name="user.age" /><br/>
<input type="submit" value="提交" />
</form>
public class UserAction extends ActionSupport {
private User user; // 自動封裝 user.name、user.age
public String check() {
System.out.println("name=" + user.getName() + ", age=" + user.getAge());
// 業務驗證邏輯
if ("admin".equals(user.getName()) && user.getAge() == 20) {
return SUCCESS;
}
// 驗證失敗:記錄字段級錯誤
addFieldError("name", "用戶名必須為 admin");
addFieldError("name", "用戶名長度不能超過 10 位"); // 同字段可添加多條
addFieldError("age", "年齡必須為 20");
return ERROR; // 對應 struts.xml 中 name="error" 的 result
}
// Getter/Setter
}
<package name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.action.UserAction" method="{1}">
<result>/success.jsp</result>
<result name="error">/error.jsp</result>
<result name="input">/register.jsp</result> <!-- 驗證框架攔截器默認返回 input -->
</action>
</package>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html><body>
<h2>驗證失敗</h2>
<ul>
<li><s:property value="errors.name[0]" /></li> <!-- 第一條 name 錯誤 -->
<li><s:property value="errors.name[1]" /></li> <!-- 第二條 name 錯誤 -->
<li><s:property value="errors.age[0]" /></li> <!-- age 錯誤 -->
</ul>
<s:debug /> <!-- 調試面板,查看值棧詳情 -->
</body></html>
輸入姓名 "test"、年齡 "25" 提交後,顯示:
addFieldError(fieldName, message):將錯誤信息存入值棧 fieldErrors Map,Key 為字段名,Value 為 Listerrors.fieldName[index]:OGNL 表達式訪問錯誤列表,`errors` 是值棧頂層對象的特殊屬性<s:fielderror fieldName="name" />:標簽自動迭代顯示該字段所有錯誤(更推薦)創建 UserAction-check-validation.xml(Action名-方法名-validation.xml):
<!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="user.name">
<field-validator type="requiredstring">
<message>用戶名不能為空</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">3</param>
<param name="maxLength">10</param>
<message>用戶名長度 3-10 位</message>
</field-validator>
</field>
<field name="user.age">
<field-validator type="int">
<param name="min">18</param>
<param name="max">60</param>
<message>年齡必須 18-60 歲</message>
</field-validator>
</field>
</validators>
需在 Action 類所在包配置 validation 攔截器(`struts-default` 已包含)。
Struts2 手動驗證通過 addFieldError + 返回 `ERROR` + `