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

Struts2 路徑問題徹底解決:統一使用相對路徑與 basePath 技巧

     編輯:Java 相關知識

問題根源

Struts2 中 URL 解析基於 Action 的 namespace + name,而非 JSP 物理路徑。若在 JSP 中使用絕對路徑(如 /project/module/page.jsp),項目遷移、部署路徑變更、Namespace 調整均會導致鏈接失效,維護成本極高。

最佳實踐:basePath 模式

1. JSP 頁面頭部提取 basePath

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

2. 頁面內所有鏈接、資源引用改為相對路徑

<!-- 跳轉到 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>

3. 原理解析

  • <base href="https://host:port/projectName/"> 設置文檔基礎 URL
  • 所有相對鏈接自動解析為 https://host:port/projectName/相對路徑
  • Action 訪問路徑:namespace/actionName.action(需在 struts.xml 配置 namespace)

struts.xml 關鍵配置

<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.action
  • 最終訪問:https://host:port/projectName/user/user.action

常見誤區與避坑

誤區後果正確做法
JSP 用 request.getRequestURI() 拼接包含 servlet 路徑,易出錯用 getContextPath() 獲取項目根路徑
Action 跳轉寫死 /jsp/xxx.jsp重構時大量改動Result 配置邏輯視圖名,Struts2 解析物理路徑
忽略 <base> 標籤相對路徑以當前頁面為基準,層級深時錯誤每頁頭部統一輸出 basePath
JS 中硬編碼 URL前後端分離時極難維護JS 讀取 basePath 全局變量,或後端渲染模板

進階:前後端分離架構下的路徑處理

  • 後端僅提供 REST API,@RestController 返回 JSON
  • 前端(Vue/React)通過 axios 請求,基礎 URL 統一配置在 .env 或 axios.interceptors
  • 無需 JSP basePath,路徑管理完全前端化

總結

Struts2 路徑問題的核心是「以 Action 邏輯路徑為準,而非 JSP 物理路徑」。統一提取 basePath + 全站相對路徑 + 正確配置 namespace,是傳統 Struts2 項目解決路徑維護噩夢的銀彈。新項目建議直接採用前後端分離架構,從根源消除此類問題。

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