首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Struts2 報錯「No Action mapped for action name [0]」深度排查

     編輯:程式設計疑難解答

專案昨晚測試正常,今早啟動卻報錯:There is no Action mapped for namespace [/] and action name [0]。但 struts.xml 中並無名為 "0" 的 Action,JSP 頁面也未發現請求 "0" 的路徑。

錯誤堆疊關鍵資訊

Could not find action or result /No2_Web/0
action name [0]
namespace [/]
context path [/No2_Web]

請求路徑 /No2_Web/0 中的 "0" 是關鍵線索——它不是 Action 名稱,而是被當作 Action 名稱解析的參數值。

根因分析

1. iframe src 路徑解析異常

A.jsp 中:

<iframe name="menu" src="user/menuhotlist.action" class="iframe_menu"></iframe>

若 menuhotlist.action 重定向到 /index_menu.jsp,而 index_menu.jsp 內部又包含相對路徑請求,可能導致路徑解析錯誤產生 "/0"。

2. 表單/連結隱藏參數攜帶了 "0"

檢查 B.jsp 中的表單隱藏域、JavaScript 動態生成的 URL、或 <a> 標籤的 href,是否有未預期的 id=0 或 menu.type=0 參數被 Struts2 的 REST 風格約定解析為 Action 名稱。

3. DynamicMethodInvocation 影響

struts.xml 啟用了:

<constant name="struts.enable.DynamicMethodInvocation" value="true" />

此設定允許 actionName!methodName 風格訪問,若前端誤傳 user/0 可能被誤識別。

排查步驟

  1. 瀏覽器 Network 面板捕獲實際發出的請求 URL,確認是否包含 "/0"
  2. 檢查重定向鏈路:menuhotlist.action → redirect:/index_menu.jsp → iframe 載入 → 內部二次請求
  3. 暫停 DynamicMethodInvocation:設為 false 測試是否消失
  4. 清理專案重新部署:清除 Tomcat work 目錄、Eclipse 清理專案、Maven clean install
  5. 在 struts.xml 添加通配攔截(臨時診斷用):
    <action name="*" class="customer.CustomerControl" method="user_{1}">
        <result name="input">/error.jsp</result>  <!-- 添加 input 結果 -->
    </action>
    

核心建議

「0」極大概率來自前端動態生成的 URL 參數(如 id=0、type=0)被 REST 風格解析器誤判為 Action 名稱。重點檢查:menu.type 參數傳遞、iframe 載入後的二次請求、JavaScript 拼接 URL 邏輯。清理重新部署通常能解決快取導致的舊映射殘留問題。

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