JSP 頁面大量使用 JSTL 標籤(<c:if>、<c:forEach>、<%@ taglib>、<%@ include> 等)會導致編譯後的 Servlet 類產生大量空白行,嚴重時甚至造成瀏覽器渲染假死。本文實測整理四種有效去除空白方案,附 Tomcat 7 + Eclipse 實測環境驗證步驟。
trimDirectiveWhitespaces (JSP 2.1+)在每個 JSP 頁面頂部加入:
<%@ page trimDirectiveWhitespaces="true" %>
指示 JSP 容器編譯時移除指令標籤產生的空白字元。優點:精準控制單頁;缺點:需逐頁修改。
在頁面適當位置(建議開頭)插入:
<% out.clear(); %>
清除當前輸出緩衝區內容。副作用:可能清除正常靜態內容,需謹慎放置。
<jsp-config> (Servlet 2.5 / JSP 2.1)<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<trim-directive-whitespaces>true</trim-directive-whitespaces>
</jsp-property-group>
</jsp-config>
專案層級生效,無需修改個別 JSP,推薦為首選方案。
trimSpaces (最徹底)修改 Tomcat 安裝目錄 conf/web.xml 中 JspServlet 定義:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>trimSpaces</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
影響該 Tomcat 實例部署的所有 Web 應用,徹底從編譯階段移除模板文字空白。
| 方案 | 生效範圍 | 侵入性 | 推薦場景 |
|---|---|---|---|
| page 指令 | 單一 JSP | 需修改源碼 | 快速驗證、特定頁面優化 |
| out.clear() | 單一 JSP | 高 (程式碼侵入) | 緊急臨時修復 |
| web.xml jsp-config | 整個 WebApp | 零源碼侵入 | 專案標準做法 |
| Tomcat trimSpaces | 容器所有 WebApp | 零源碼侵入 | 運維統一治理、多專案共享容器 |
實測環境:Windows 7 + Eclipse 2014 + Tomcat 7.0 + JDK 1.7。核心心法:配置修改後必須 Clean 重新發布才能生效,這是許多開發者踩坑的關鍵。