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

Struts 源碼深度解析:html:cancel 標籤與 isCancelled() 機制

     編輯:Java 程式設計入門

html:cancel 標籤行為分析

<html:cancel> 標籤產生的 HTML 為:

<input type="submit" name="org.apache.struts.taglib.html.CANCEL" value="返回" onclick="bCancel=true;">

關鍵點:

  • type="submit" — 會提交表單
  • name="org.apache.struts.taglib.html.CANCEL" — 特殊參數名,Struts 攔截識別
  • onclick="bCancel=true;" — JavaScript 旗標,配合 Validator 跳過驗證

Validator 整合機制

Struts 自動產生的驗證 JavaScript:

var bCancel = false;
function validateForm(form) {
    if (bCancel) return true; // 取消時跳過驗證
    return validateRequired(form) && validateMaxLength(form) ...;
}

若 Action 未處理取消邏輯,Cancel 鍵效果等同 Submit!

Action 中正確處理取消

public class MyAction extends Action {
    public ActionForward execute(ActionMapping mapping, ActionForm form,
                                 HttpServletRequest request, HttpServletResponse response) {
        if (isCancelled(request)) {
            return mapping.findForward("cancel"); // 導向取消頁面
        }
        // 正常業務邏輯
        return mapping.findForward("success");
    }
}

isCancelled() 源碼追蹤

// Action.java
protected boolean isCancelled(HttpServletRequest request) {
    return request.getAttribute(Globals.CANCEL_KEY) != null;
}

Globals.CANCEL_KEY = "org.apache.struts.action.CANCEL"。

RequestProcessor 處理流程

關鍵在 processPopulate():

protected void processPopulate(HttpServletRequest request, HttpServletResponse response,
                               ActionForm form, ActionMapping mapping) throws ServletException {
    // ... 填充表單屬性 ...

    // 檢測 Cancel 按鈕
    if (request.getParameter(Constants.CANCEL_PROPERTY) != null ||
        request.getParameter(Constants.CANCEL_PROPERTY_X) != null) {
        request.setAttribute(Globals.CANCEL_KEY, Boolean.TRUE);
    }
}

Constants.CANCEL_PROPERTY = "org.apache.struts.taglib.html.CANCEL",與 Cancel 標籤產生的 name 屬性完全一致。

完整呼叫鏈

  1. 用戶點擊 Cancel 按鈕 → 表單提交,帶參數 org.apache.struts.taglib.html.CANCEL
  2. ActionServlet.process() → RequestProcessor.process()
  3. processPopulate() 偵測到參數 → request.setAttribute(Globals.CANCEL_KEY, Boolean.TRUE)
  4. processValidate() 發現 CANCEL_KEY 存在 → 跳過表單驗證
  5. Action.execute() 呼叫 isCancelled(request) → 返回 true → 導向取消頁面

開發者必知要點

  • Cancel 按鈕本質是 Submit,必須在 Action 顯式判斷 isCancelled()
  • 若未判斷,取消操作會執行正常業務流程(潛在 Bug)
  • Validator 整合時,Cancel 會自動跳過客戶端/伺服器端驗證
  • Constants.CANCEL_PROPERTY_X 處理圖片型提交按鈕(<input type="image">)產生的 name.x/name.y 參數
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved