JSP 指令(Directive)不產生輸出,而是指導容器如何編譯頁面。三大指令 page、include、taglib 涵蓋了編碼、導入、緩衝、錯誤處理、標簽庫等核心配置。本文系統整理屬性用法與避坑指南。
<%@ page
language="java"
contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"
session="true"
buffer="8kb"
autoFlush="true"
isThreadSafe="true"
errorPage="/error/500.jsp"
isErrorPage="false"
import="java.util.*,com.example.model.*"
isELIgnored="false"
%>
| 屬性 | 默認值 | 關鍵說明 |
|---|---|---|
| language | java | 目前僅支持 java,保留擴展性 |
| extends | 無 | 指定生成 Servlet 父類,**慎用**,限制容器優化 |
| import | java.lang.*, javax.servlet.*, javax.servlet.jsp.*, javax.servlet.http.* | 多包用逗號分隔,建議在文件頂部集中聲明 |
| session | true | 無需 Session 的頁面(如靜態展示、API)設為 false 節省內存 |
| buffer | 8kb | none 關閉緩衝,大頁面可調大如 32kb;關閉後 autoFlush 必為 true |
| autoFlush | true | true:緩衝區滿自動刷新;false:拋異常(需配合 buffer≠none) |
| isThreadSafe | true | false 會強制單線程執行,嚴重降低吞吐,**生產禁用** |
| info | 無 | 任意字符串,可通過 getServletInfo() 獲取,用於版本/作者標識 |
| errorPage | 無 | 拋出未捕獲異常時轉發的頁面(相對路徑),需配合目標頁 isErrorPage=true |
| isErrorPage | false | true 時可使用隱含對象 exception 獲取異常信息 |
| contentType | text/html;ISO-8859-1 | 響應 MIME + charset,**必須顯式設置 UTF-8** |
| pageEncoding | ISO-8859-1 | 源文件編碼,**必須與文件實際保存編碼一致** |
| isELIgnored | false | true 禁用 EL 表達式(${...} 當文本輸出),舊項目遷移時偶爾用到 |
<%@ include file="/common/header.jsp" %>
_jspService 方法中,變量名衝突會編譯報錯。pageEncoding 聲明正確編碼,或在包含處統一設置。<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="https://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="https://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="my" tagdir="/WEB-INF/tags" %> <!-- Tag File 方式 -->
WEB-INF/tld/,uri 為 TLD 中 <uri> 值。/WEB-INF/tags/**/*.tag 文件,無需 TLD,開發自定義標簽極其便捷。pageEncoding 可能不生效導致中文亂碼。WEB-INF/tld/、web.xml 是否聲明 <jsp-config><taglib>(Servlet 2.4+ 通常自動掃描無需配置)、jar 包是否含 META-INF/tld/。${user.name} 字面量,檢查 web.xml version 屬性(2.4+ 默認啟用 EL)或額外設置 isELIgnored="true"。掌握三大指令的屬性語義與交互關係,能讓 JSP 編譯行為可控、可預測,是從「能跑」到「穩健」的關鍵一步。