首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

Struts2 Action 方法級輸入校驗機制深度解析

     編輯:C++ 入門

校驗流程總覽

Struts2 的輸入校驗是攔截器鏈的一部分,核心流程如下:

  1. 類型轉換:請求參數 → Action 屬性(由 ConversionInterceptor 驅動)
  2. 轉換錯誤處理:異常信息存入 ActionContext,ConversionErrorInterceptor 將其加入 fieldErrors
  3. 方法級校驗:反射調用 validateXxx()(Xxx 為 action 方法名)
  4. 類級校驗:調用 validate()
  5. 結果判定:fieldErrors 非空 → 轉發到 input 結果;否則執行 action 方法

轉發到 input 的兩大原因

  • 類型轉換異常(如字符串無法轉 Date)
  • 校驗邏輯失敗(validateXxx() 或 validate() 中 addFieldError)

實戰示例:自定義 Date 類型轉換器

Action 類

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; }
}

JSP 頁面

<%@ 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>

struts.xml 配置

<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.properties

birthday=com.itheima.converter.DateTypeConverter

關鍵點解析

  1. 方法級校驗優先:validateExecute1() 只在調用 execute1() 時觸發,實現不同方法不同校驗規則。
  2. 類型轉換異常不阻斷流程:即使轉換失敗,仍會進入校驗階段,收集所有錯誤一次性反饋。
  3. fielderror 標籤:自動渲染 fieldErrors 中的所有錯誤信息。
  4. 轉換器註冊:<ActionClass>-conversion.properties 文件名固定,鍵為屬性名,值為轉換器全限定名。

常見坑點

  • 日期格式 yyyyMMdd 中 MM 是月份,mm 是分鐘 —— 寫錯會導致解析錯誤
  • validateXxx() 方法名必須與 action 方法名完全對應(大小寫敏感)
  • 若 validate() 拋出異常,需確保不影響 validateXxx() 的執行順序
  • 類型轉換器應處理 null 與空字符串情況,避免 NPE

總結

Struts2 的校驗機制將類型轉換、方法級校驗、類級校驗解耦,靈活性極高。掌握「轉換器 + validateXxx() + fielderror」三件套,即可優雅處理複雜表單校驗場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved