Servlet 開發中路徑問題高發,本文系統梳理六大場景路徑規則,附帶對比表與最佳實踐。
| 場景 | 路徑前綴 | 相對基準 | 示例 |
|---|---|---|---|
| 1. web.xml <url-pattern> | 以 / 或 * 開頭 | 專案上下文根 | /servlet/*, *.do |
| 2. 轉發/包含 (RequestDispatcher) | 以 / 開頭 | 專案上下文根 | request.getRequestDispatcher("/BServlet") |
不以 / 開頭 | 當前 Servlet 路徑 | 若當前 /servlet/AServlet → BServlet 解析為 /servlet/BServlet | |
| 3. 重定向 (response.sendRedirect) | 以 / 開頭 | 主機根 (需手動加專案名) | response.sendRedirect("/day10_1/Bservlet") |
| 4. 頁面超鏈接/表單 (a href, form action) | 同重定向(客戶端路徑) | 主機根 | <a href="/day10_1/AServlet"> |
不以 / 開頭 | 當前頁面目錄 | 頁面 /html/form.html → AServlet 解析為 /html/AServlet | |
| 5. ServletContext.getResource() | 以 / 開頭 | Web 內容根 (index.jsp 所在目錄) | context.getResource("/WEB-INF/config.xml") |
| 6. ClassLoader.getResource() | 不以 / 開頭 | Classpath 根 (classes 目錄) | clazz.getResource("config.properties") |
以 / 開頭 | Classpath 根 | clazz.getResource("/config.properties") |
/ 開頭/ 開頭的絕對路徑,減少相對路徑歧義<c:url value="/path" /> 或 ${pageContext.request.contextPath}/path 自動補全專案名ClassLoader.getResourceAsStream() 讀取 classpath 下資源url-pattern 採用 /api/* 風格,RESTful 更清晰