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

JSP 轉發至同層子資料夾:正確路徑寫法與常見誤區

     編輯:程式設計綜合問答

在 JSP/Servlet 專案中,從 WebRoot/index.jsp 要 forward 到 WebRoot/admin/main.jsp,許多開發者直覺寫 /admin/main.jsp 卻報 404。這篇文章釐清「相對路徑」與「絕對路徑」在 RequestDispatcher 中的真實行為。

錯誤示範

// 錯誤:以 / 開頭被視為 Web 應用程式根目錄(Context Root)
request.getRequestDispatcher("/admin/main.jsp").forward(request, response);

若專案部署在 https://localhost:8080/myapp/,上述路徑會解析為 /myapp/admin/main.jsp。但若 admin 資料夾實際位於 WebRoot/admin/,則正確路徑應為 admin/main.jsp(不以 / 開頭)。

路徑解析規則總覽

寫法解析基準適用場景
/admin/main.jspContext Root(專案根目錄)跨資料夾、統一入口
admin/main.jsp當前請求的資料夾(Relative to current request)同層或子資料夾
../other.jsp當前請求的上一層返回上層目錄

最佳實務建議

  1. 統一使用絕對路徑(以 / 開頭):在專案啟動時取得 contextPath,拼接完整路徑,避免相對路徑隨呼叫層級改變而出錯。
    String path = request.getContextPath() + "/admin/main.jsp";
    request.getRequestDispatcher(path).forward(request, response);
  2. 資源放置位置確認:確認 admin 資料夾確實在 WebRoot(或 src/main/webapp)下,而非 WEB-INF 內(後者不可直接存取)。
  3. 檢查 web.xml 欢迎頁面與 Servlet 映射:確保沒有攔截器或 Filter 阻擋轉發。

補充:Redirect vs Forward

  • forward:伺服器端跳轉,瀏覽器 URL 不變,共享同一個 request 物件。
  • sendRedirect:客戶端跳轉,瀏覽器 URL 改變,發起新請求,需用絕對 URL 或以 / 開頭的 Context Root 路徑。

結語

JSP 轉發路徑的關鍵在於「以 / 開頭 = Context Root 絕對路徑;不以 / 開頭 = 相對當前請求路徑」。養成使用 request.getContextPath() 拼接完整路徑的習慣,能徹底杜絕部署環境變更導致的 404 錯誤。

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