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

JSP 靜態包含 vs 動態包含:@include 與 jsp:include 本質差異實測

     編輯:關於JSP

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">`

執行結果

  • index1.jsp (靜態包含) → 編譯錯誤:變數 `path` 重複宣告。
  • index2.jsp (動態包含) → 正常執行:無編譯錯誤。

底層機制解析

靜態包含 `@include` (Translation-time Include)

  • 發生在 JSP 編譯階段 (Translation Phase)。
  • 容器將被包含檔案內容 直接合併 到主 JSP 原始碼中,形成單一 Servlet 類。
  • 合併後若有同名變數/方法宣告 → 編譯失敗。
  • 適用:純靜態片段 (HTML 片段、常數定義、無衝突的工具方法)。

動態包含 `<jsp:include>` (Request-time Include)

  • 發生在 請求處理階段 (Request Processing Phase)。
  • 主頁面與被包含頁面 各自編譯為獨立 Servlet 類。
  • 執行時以 `RequestDispatcher.include()` 調用目標 Servlet,合併輸出流。
  • 變數作用域隔離,無衝突風險。
  • 支援傳遞參數:`<jsp:param name="k" value="v"/>`。
  • 適用:動態內容片段、需隔離變數作用域、條件式包含。

核心差異總結

維度@include (靜態)jsp:include (動態)
處理階段編譯期請求期
生成 Servlet單一合併類獨立多個類
變數衝突會衝突隔離不衝突
參數傳遞不支援支援 jsp:param
目標資源變更需重新編譯主頁即時生效
效能略優 (無額外調用)微額外開銷

最佳實踐建議

  1. 預設使用動態包含:安全、彈性、支援參數傳遞,效能差異可忽略。
  2. 僅在極確定無變數衝突、內容極少變動的靜態片段 (如版權聲明、CSS/JS 參考) 使用靜態包含。
  3. 避免在被靜態包含檔案中宣告變數/方法,改用 `<%! ... %>` 宣告實例/類成員,或移至共用 JavaBean。

理解編譯期 vs 請求期的本質差異,是避免 JSP 包含陷阱的關鍵。

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