Struts2 校驗體系建立在 ActionSupport 基礎上,提供編碼式(validate())與 XML 聲明式兩種模式。本文系統梳理核心類結構、兩種校驗方式配置、主題樣式衝突解決及訪問器模式校驗嵌套對象。
實現接口:Action、Validateable、ValidationAware、TextProvider、LocaleProvider、Serializable。
關鍵方法:
validate():模板方法,execute() 前自動調用addFieldError(field, msg):註冊字段錯誤getFieldErrors():獲取錯誤映射getText(key):國際化消息獲取public class LoginValidateAction extends ActionSupport {
private User user;
@Override
public void validate() {
if (user.getUname().isEmpty())
addFieldError("uname", "用戶名不能為空!");
if (user.getUpwd().isEmpty())
addFieldError("upwd", "密碼不能為空!");
}
public String execute() {
if ("admin".equals(user.getUname()) && "admin".equals(user.getUpwd()))
return SUCCESS;
return INPUT;
}
// getter/setter
}
struts.xml 需配置 <result name="input"> 跳轉回輸入頁。
默認 XHTML 主題 自動生成表格佈局,導致 <s:fielderror/> 顯示混亂。
方案:全局切換 Simple 主題:
<constant name="struts.ui.theme" value="simple" />
或標簽級指定 theme="simple"。Simple 主題輸出純文本/簡單標籤,便於 CSS 控制。
進階顯示:使用 <s:property value="fieldErrors.uname[0]"/> 精確輸出首條錯誤。
文件命名:Action類名-validation.xml,同包目錄。
執行順序:XML 校驗優先於 validate()。
三類校驗規則:
<field name="uname">
<field-validator type="requiredstring">
<message>用戶名不能為空</message>
</field-validator>
</field>
<validator type="fieldexpression">
<param name="expression"><![CDATA[pwd == pwd2]]></param>
<message>兩次密碼不一致</message>
</validator>
Action 中屬性 user 為自定義類型:
<field name="user">
<field-validator type="visitor">
<param name="context">userContext</param>
<param name="appendPrefix">true</param>
<message>用戶信息</message>
</field-validator>
</field>
需提供 User-userContext-validation.xml(User 類同包)定義嵌套字段校驗。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"https://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="uname">
<field-validator type="requiredstring">
<message>用戶名不能為空</message>
</field-validator>
</field>
<field name="upwd">
<field-validator type="requiredstring">
<message>密碼不能為空</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">18</param>
<message>密碼長度 ${minLength}--${maxLength} 位</message>
</field-validator>
</field>
</validators>
ActionSupport 獲取校驗、國際化、錯誤收集能力struts.ui.theme=simple 避免默認樣式干擾