Struts2 提供兩種服務端校驗方式:重寫 ActionSupport.validate() 方法(編碼式)與專用 XML 配置文件(聲明式)。本文對比兩種模式並解決常見顯示樣式問題。
自定義 Action 建議繼承 com.opensymphony.xwork2.ActionSupport,它實現:
Action 接口(SUCCESS/ERROR/LOGIN/INPUT/NONE 常量 + execute())Validateable:提供 validate() 模板方法,在 execute() 前調用ValidationAware:收集字段/Action 錯誤消息(addFieldError 等)TextProvider/LocaleProvider:國際化支持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; // 校驗失敗或業務失敗返回 INPUT
}
// getter/setter
}
<action name="LoginValidateAction" class="cn.struts2.action.LoginValidateAction">
<result name="success">success.jsp</result>
<result name="input">LoginValidateAction.jsp</result> <!-- 校驗失敗跳轉 -->
</action>
<s:fielderror /> <!-- 顯示所有字段錯誤 -->
<!-- 或單字段 --> <s:fielderror fieldName="uname" />
現象:默認 XHTML 主題自動包裝 <table><tr><td>,導致錯誤消息佈局混亂。
解決:在 struts.xml 全局設置簡潔主題:
<constant name="struts.ui.theme" value="simple" />
或單標簽指定 theme="simple"。Simple 主題不輸出多餘標籤,便於自定義 CSS。
規則:文件名 Action類名-validation.xml,放置於 Action 同包下。
優先級:XML 校驗先於編碼式校驗執行。
<?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>
requiredstring:非空字符串stringlength:長度範圍int/double/date:類型與範圍regex:正則表達式fieldexpression:OGNL 表達式跨字段校驗(如密碼一致性)visitor:嵌套對象校驗(模型驅動模式)| 維度 | 編碼式 validate() | XML 配置式 |
|---|---|---|
| 靈活性 | 高(任意 Java 邏輯) | 中(預定義校驗器) |
| 復用性 | 低 | 高(可共享校驗文件) |
| 維護性 | 代碼耦合 | 聲明分離 |
| 執行順序 | 後 | 前 |
建議:通用規則(非空、長度、格式)用 XML;複雜業務規則用 validate()。統一設置 struts.ui.theme=simple 避免樣式干擾。