在 Java Web 開發中,相對路徑的寫法直接決定了資源請求的最終定位位置。簡單來說:以「/」開頭的路徑會從網站根目錄(域名+端口)開始解析;不以「/」開頭則從當前請求的目錄層級開始計算。這一區別在前端頁面引用靜態資源、後端請求轉發與重定向等場景中至關重要,稍有不慎就會導致 404 錯誤。
假設專案部署路徑為 localhost:8080/resolvent/,且頁面未設定 <base href> 標籤。當訪問 index.jsp 或 Servlet 路徑 /servlet/dnf 時,路徑解析規則如下:
根目錄鎖定為 localhost:8080(域名+端口)。例如:
<script src="/demo.js"></script>
無論當前頁面位於 /resolvent/ 或 /resolvent/servlet/,瀏覽器最終都會請求 localhost:8080/demo.js。
基準目錄為當前頁面所在目錄:
localhost:8080/resolvent/index.jsp 中引用 src="demo.js" → 請求 localhost:8080/resolvent/demo.jslocalhost:8080/resolvent/servlet/dnf 中引用 src="demo.js" → 請求 localhost:8080/resolvent/servlet/demo.js最佳實踐:在 JSP 頁面頂部加入 <base href="<%=request.getScheme()%>://<%=request.getServerName()%>:<%=request.getServerPort()%><%=request.getContextPath()%>/>,統一基準路徑,避免層級混淆。
後端 request.getRequestDispatcher() 的路徑解析規則與前端不同:**以「/」開頭時,根目錄為當前 Web 應用的上下文路徑(即 localhost:8080/resolvent)**。
request.getRequestDispatcher("/login.jsp").forward(request, response);
無論當前 Servlet 路徑為 /servlet/dnf 或 /index.jsp,最終都會定位到 localhost:8080/resolvent/login.jsp。
request.getRequestDispatcher("login.jsp").forward(request, response);
基準目錄為當前請求的 Servlet 路徑:
/servlet/dnf 轉發 → 定位 localhost:8080/resolvent/servlet/login.jsp/index.jsp 轉發 → 定位 localhost:8080/resolvent/login.jsp| 場景 | 以「/」開頭 | 不以「/」開頭 |
|---|---|---|
| 前端靜態資源 | 域名+端口(網站根目錄) | 當前頁面目錄 |
| 後端轉發/重定向 | Web 應用上下文路徑 | 當前請求 Servlet 目錄 |
掌握這一核心差異,能有效避免 Java Web 專案中常見的資源找不到、頁面跳轉錯誤等問題。