JSP 引入外部檔案有兩種語法:`@include file="..."` (靜態包含) 與 `<jsp:include page="...">` (動態包含)。許多開發者混用導致難以排查的編譯錯誤。本文通過實測案例揭示底層機制差異。
include/include.jsp:含變數宣告 `String path = request.getContextPath();`index1.jsp:使用 `@include file="/include/include.jsp"`index2.jsp:使用 `<jsp:include page="/include/include.jsp">`@include` (Translation-time Include)<jsp:include>` (Request-time Include)RequestDispatcher.include()` 調用目標 Servlet,合併輸出流。<jsp:param name="k" value="v"/>`。| 維度 | @include (靜態) | jsp:include (動態) |
|---|---|---|
| 處理階段 | 編譯期 | 請求期 |
| 生成 Servlet | 單一合併類 | 獨立多個類 |
| 變數衝突 | 會衝突 | 隔離不衝突 |
| 參數傳遞 | 不支援 | 支援 jsp:param |
| 目標資源變更 | 需重新編譯主頁 | 即時生效 |
| 效能 | 略優 (無額外調用) | 微額外開銷 |
<%! ... %>` 宣告實例/類成員,或移至共用 JavaBean。理解編譯期 vs 請求期的本質差異,是避免 JSP 包含陷阱的關鍵。