指令語法
<%@ include file="relative/path.jsp" %>
路徑解析規則
| 路徑形式 | 解析基準 | 示例 |
以 / 開頭 | Web 應用根目錄 (Context Root) | /common/header.jsp → $WEBAPP_ROOT/common/header.jsp |
不以 / 開頭 | 當前 JSP 文件所在目錄 | ../fragment/nav.jsp → 相對當前目錄向上一層 |
關鍵區別:include 指令 vs include 動作
| 特性 | <%@ include %> (指令) | <jsp:include> (動作) |
| 處理階段 | 編譯期(合併源碼再編譯) | 運行期(獨立編譯,運行時合併輸出) |
| 路徑解析 | 相對當前 JSP 文件 | 相對 Context Root(同 request.getRequestDispatcher) |
| 參數傳遞 | 不支援 | 支援 <jsp:param> |
| 修改生效 | 需重新編譯主頁面 | 即時生效 |
| 適用場景 | 靜態片段(header/footer) | 動態內容、條件包含 |
常見錯誤與修正
- 誤以為
/ 代表文件系統根目錄:在 Web 容器中永遠是 Context Root。
- 跨模組引用失敗:不同 Web 模組無法直接
include,需打包為 JAR 放入 WEB-INF/lib 或使用 HTTP 包含(<c:import>)。
file 屬性不可用 EL 表達式(${path}),需改用 <jsp:include page="${path}">。
最佳實踐
<%-- 靜態佈局片段,編譯期包含 --%>
<%@ include file="/WEB-INF/views/layout/header.jsp" %>
<%-- 動態內容區塊,運行期包含 --%>
<jsp:include page="/dynamic/sidebar">
<jsp:param name="userId" value="${param.userId}" />
</jsp:include>
總結
<%@ include file="/xxx" %> 以 / 開頭 = 相對 Web 應用根;無 / = 相對當前 JSP 目錄。切記區分編譯期指令與運行期動作,選錯會導致路徑 404 或參數無法傳遞。