在企業級 Web 開發中,常需將業務表單嵌入審批頁面。本文深入比較三種主流嵌套方案:<%@ include %>、<jsp:include> 與 <iframe>,並針對常見的 JavaScript 錯誤與中文亂碼問題提供解決方案。
<%@ include file="..." %>)特點:編譯階段合併檔案,不檢查被包含檔案的變更,效能最佳。
適用場景:包含靜態資源(JS、CSS、常量定義)或極少變動的片段。
<%@ include file="biz.htm" %>
<jsp:include>)特點:請求階段動態插入,會檢查檔案變更,支援傳遞參數,適合動態內容。
語法範例:
<jsp:include page="/jsp/oa/biz/<%=path[1]%>/<%=path[2]%>.jsp" flush="true">
<jsp:param value="<%=piId%>" name="piId"/>
<jsp:param value="view" name="action"/>
</jsp:include>
關鍵屬性 flush="true":當緩衝區累積一定資料時,伺服器會先輸出部分內容給瀏覽器,減少客戶端等待延遲。若為 false(預設),伺服器會等待整個頁面產生完畢後一次性輸出。在包含大量資料的頁面中,設為 true 可改善首屏載入體驗。
避坑指南:若在同一 JSP 中不斷 include 自己,會形成邏輯死循環,導致伺服器掛起。
特點:瀏覽器原生支援,將子頁面作為獨立文檔載入,樣式與腳本隔離度高。
<iframe id="logfrm" src="login_files/loginbox.jsp" frameborder="0" scrolling="no"></iframe>
原因:動態生成的 JS 字串中包含換行符、空格或特殊字元,導致語法解析失敗。
解決:移除字串中的多餘空白字元,或使用模板引擎正確轉義輸出。
解決:在被嵌套的 JSP 頁面頂部強制指定編碼:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
範例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<nav class="navbar navbar-default" role="navigation">
<div class="container">
<a class="navbar-brand" href="/metamaintain-web/group">產品配置模塊</a>
<!-- 更多導航內容 -->
</div>
</nav>
| 方案 | 耦合度 | 效能 | 隔離性 | 推薦場景 |
|---|---|---|---|---|
| 靜態 Include | 高(編譯期合併) | 最佳 | 無 | 靜態資源、通用常量 |
| 動態 Include | 中(請求期合併) | 良好 | 部分(共享 request/response) | 動態片段、需傳參數 |
| Iframe | 低(獨立文檔) | 較低(額外 HTTP 請求) | 高(樣式/JS 隔離) | 跨域嵌入、獨立功能模組 |