Struts 2 中最直接的驗證方式是覆寫 ActionSupport 提供的 validate() 方法。框架在調用 execute() 前會自動呼叫 validate(),若發現錯誤則返回 input 結果,阻止 execute() 執行。本文將通過完整範例,講解字段錯誤、動作錯誤、成功訊息的添加與顯示,以及 ValidationAware 接口的核心方法。
ActionSupport 實現 Validateable 接口,擁有 validate() 方法。addFieldError()(字段級)或 addActionError()(動作級)記錄錯誤。addActionMessage() 記錄成功訊息。"input",不再執行 execute()。<%@ page language="java" pageEncoding="GBK"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head><title>驗證數據</title></head>
<body>
<s:actionerror/>
<s:actionmessage/>
<s:form action="validate.action" theme="simple">
輸入內容:<s:textfield name="msg"/>
<s:fielderror key="msg.hello" />
<br/>
<s:submit/>
</s:form>
</body>
</html>
<s:actionerror>、<s:fielderror>、<s:actionmessage> 分別顯示動作錯誤、字段錯誤、成功訊息;無訊息時不顯示。
package action;
import com.opensymphony.xwork2.ActionSupport;
public class ValidateAction extends ActionSupport {
private String msg;
@Override
public String execute() {
System.out.println(SUCCESS);
return SUCCESS;
}
@Override
public void validate() {
if (!"hello".equalsIgnoreCase(msg)) {
System.out.println(INPUT);
addFieldError("msg.hello", "必須輸入 hello!");
addActionError("處理動作失敗!");
} else {
addActionMessage("提交成功");
}
}
// getter/setter 省略
}
字段錯誤需指定 key(對應 JSP fielderror 的 key),動作錯誤/訊息只需字串。
<package name="demo" extends="struts-default">
<action name="validate" class="action.ValidateAction">
<result name="success">/error/validate.jsp</result>
<result name="input">/error/validate.jsp</result>
</action>
</package>
同一 JSP 處理 success 與 input,配合標籤顯示不同狀態。
所有添加/獲取錯誤與訊息的方法均定義於 ValidationAware,ActionSupport 內部委託 ValidationAwareSupport 實現:
public interface ValidationAware {
void setActionErrors(Collection errorMessages);
Collection getActionErrors();
void setActionMessages(Collection messages);
Collection getActionMessages();
void setFieldErrors(Map errorMap);
Map getFieldErrors();
void addActionError(String anErrorMessage);
void addActionMessage(String aMessage);
void addFieldError(String fieldName, String errorMessage);
boolean hasActionErrors();
boolean hasActionMessages();
boolean hasErrors();
boolean hasFieldErrors();
}
常用於在 JSP 或其他邏輯中程式化檢查錯誤狀態。
https://localhost:8080/demo/validate.jsp 測試。validate() 適合簡單、單一 Action 的驗證邏輯;複雜專案建議改用 Validation 框架(XML 配置)實現關注點分離。