| 特性 | include 指令 <%@ include file="..." %> | include 動作 <jsp:include page="..." /> |
|---|---|---|
| 處理階段 | 編譯期 | 請求期 |
| 合併方式 | 原始碼合併為單一 Servlet | 執行時動態插入回應 |
| 變數共享 | 共享區域變數,易衝突 | 各自獨立,無衝突 |
| 修改生效 | 需重新編譯主頁 | 立即生效 |
| 適用對象 | 靜態片段、共用程式碼 | 動態內容、獨立功能模組 |
| 傳遞參數 | 不支援 | 支援 <jsp:param> |
<%@ include file="header.jsp" %>
<%! ... %> 宣告、<% ... %> 程式碼片段、HTML 全部融合request、session、application 物件當然共享<jsp:include page="menu.jsp" flush="true">
<jsp:param name="category" value="news" />
</jsp:include>
<jsp:include> 暫停flush="true" 強制刷新)pageContext,區域變數不衝突<jsp:param> 傳遞資料page 屬性可指向 Servlet URL<!-- common_decls.jsp -->
<%!
public static final String SITE_NAME = "MySite";
public String formatDate(Date d) { ... }
%>
<!-- main.jsp -->
<%@ include file="common_decls.jsp" %>
<%= SITE_NAME %> <%= formatDate(new Date()) %>
<!-- user_card.jsp -->
<%@ page import="java.util.*" %>
<%
String name = request.getParameter("name");
String role = request.getParameter("role");
%>
<div class="card">
<h4><%= name %></h4>
<span class="role"><%= role %></span>
</div>
<!-- dashboard.jsp -->
<jsp:include page="user_card.jsp" flush="true">
<jsp:param name="name" value="<%= currentUser.getName() %>" />
<jsp:param name="role" value="<%= currentUser.getRole() %>" />
</jsp:include>
錯誤寫法:
<!-- main.jsp -->
<% String msg = "Hello"; %>
<jsp:include page="show.jsp" />
<!-- show.jsp -->
<%= msg %> <!-- 編譯錯誤:msg 未定義 -->
正確做法:放入 request 範圍:
<% request.setAttribute("msg", "Hello"); %>
<jsp:include page="show.jsp" />
<<%= request.getAttribute("msg") %>
純靜態 HTML 片段(版權聲明、導航列結構不變)用指令包含較佳,避免每次請求額外處理開銷。
JSP 2.0+ 推薦使用 .tag 檔案(放在 /WEB-INF/tags/),提供更強大的封裝與參數型別檢查:
<!-- /WEB-INF/tags/userCard.tag -->
<%@ tag body-content="empty" %>
<%@ attribute name="name" required="true" type="java.lang.String" %>
<%@ attribute name="role" required="true" type="java.lang.String" %>
<div class="card"><h4>${name}</h4><span>${role}</span></div>
<-- 使用 -->
<%@ taglib prefix="my" tagdir="/WEB-INF/tags" %>
<my:userCard name="${user.name}" role="${user.role}" />
<%@ include %>(或改用 Tag File)<jsp:include>