Struts2 的輸入校驗是攔截器鏈的一部分,核心流程如下:
ConversionInterceptor 驅動)ActionContext,ConversionErrorInterceptor 將其加入 fieldErrorsvalidateXxx()(Xxx 為 action 方法名)validate()fieldErrors 非空 → 轉發到 input 結果;否則執行 action 方法Date)validateXxx() 或 validate() 中 addFieldError)public class InvidateAction extends ActionSupport {
private String username, tel;
private Date birthday;
private String msg;
// getters/setters 省略
public void validate() {} // 類級校驗
public String execute1() { msg = "execute1"; return SUCCESS; }
public String execute2() { msg = "execute2"; return SUCCESS; }
}
<%@ taglib uri="/struts-tags" prefix="s" %>
<html><body>
<s:fielderror/>
<s:form action="invalidate">
<s:textfield name="username" label="Username"/>
<s:textfield name="tel" label="Telephone"/>
<s:textfield name="birthday" label="Birthday (yyyymmdd)"/>
<s:submit method="execute1" value="Submit 1"/>
<s:submit method="execute2" value="Submit 2"/>
</s:form>
</body></html>
<action name="invalidate" class="com.itheima.action.InvidateAction" method="{1}">
<result name="success">/success.jsp</result>
<result name="input">/person.jsp</result>
</action>
public class DateTypeConverter extends DefaultTypeConverter {
private static final SimpleDateFormat FMT = new SimpleDateFormat("yyyyMMdd");
@Override
public Object convertValue(Map<String, Object> context, Object value, Class<?> toType) {
if (toType == Date.class) {
String[] strs = (String[]) value;
try { return FMT.parse(strs[0]); }
catch (ParseException e) { throw new RuntimeException(e); }
} else if (toType == String.class) {
return FMT.format((Date) value);
}
return null;
}
}
InvidateAction-conversion.propertiesbirthday=com.itheima.converter.DateTypeConverter
validateExecute1() 只在調用 execute1() 時觸發,實現不同方法不同校驗規則。fielderror 標籤:自動渲染 fieldErrors 中的所有錯誤信息。<ActionClass>-conversion.properties 文件名固定,鍵為屬性名,值為轉換器全限定名。yyyyMMdd 中 MM 是月份,mm 是分鐘 —— 寫錯會導致解析錯誤validateXxx() 方法名必須與 action 方法名完全對應(大小寫敏感)validate() 拋出異常,需確保不影響 validateXxx() 的執行順序null 與空字符串情況,避免 NPEStruts2 的校驗機制將類型轉換、方法級校驗、類級校驗解耦,靈活性極高。掌握「轉換器 + validateXxx() + fielderror」三件套,即可優雅處理複雜表單校驗場景。