Struts2 中 URL 解析基於 Action 的 namespace + name,而非 JSP 物理路徑。若在 JSP 中使用絕對路徑(如 /project/module/page.jsp),項目遷移、部署路徑變更、Namespace 調整均會導致鏈接失效,維護成本極高。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath(); // /projectName
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":"
+ request.getServerPort()
+ path + "/"; // 末尾帶 /
%>
<base href="<%=basePath%>" />
<!-- 跳轉到 Action -->
<a href="user/user!list.action">用戶列表</a>
<!-- 引入 CSS/JS -->
<link rel="stylesheet" href="css/style.css" />
<script src="js/main.js"></script>
<!-- 表單提交 -->
<form action="user/user!save.action" method="post">...</form>
<base href="https://host:port/projectName/"> 設置文檔基礎 URLhttps://host:port/projectName/相對路徑namespace/actionName.action(需在 struts.xml 配置 namespace)<package name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.example.UserAction">
<result>/user_list.jsp</result>
</action>
</package>
namespace="/user" 對應 URL 中的 /user/name="user" 對應 user!method 或 user.actionhttps://host:port/projectName/user/user.action| 誤區 | 後果 | 正確做法 |
|---|---|---|
JSP 用 request.getRequestURI() 拼接 | 包含 servlet 路徑,易出錯 | 用 getContextPath() 獲取項目根路徑 |
Action 跳轉寫死 /jsp/xxx.jsp | 重構時大量改動 | Result 配置邏輯視圖名,Struts2 解析物理路徑 |
忽略 <base> 標籤 | 相對路徑以當前頁面為基準,層級深時錯誤 | 每頁頭部統一輸出 basePath |
| JS 中硬編碼 URL | 前後端分離時極難維護 | JS 讀取 basePath 全局變量,或後端渲染模板 |
@RestController 返回 JSONaxios 請求,基礎 URL 統一配置在 .env 或 axios.interceptorsbasePath,路徑管理完全前端化Struts2 路徑問題的核心是「以 Action 邏輯路徑為準,而非 JSP 物理路徑」。統一提取 basePath + 全站相對路徑 + 正確配置 namespace,是傳統 Struts2 項目解決路徑維護噩夢的銀彈。新項目建議直接採用前後端分離架構,從根源消除此類問題。