JSP 容器自動為每個頁面提供 8+1 個預定義變量(隱含對象),無需宣告即可在 Scriptlet 與表達式中直接使用。它們分別封裝了 Servlet API 的核心接口,是 JSP 與底層容器交互的橋樑。
| 對象 | 類型 | 核心用途 |
|---|---|---|
| request | HttpServletRequest | 取得請求參數(getParameter)、Header、Cookie、Client IP、Session ID 等 |
| response | HttpServletResponse | 設定狀態碼、Header、Content-Type、Cookie、重導向(sendRedirect) |
| out | JspWriter | 輸出流,內建緩衝控制(clear、flush、getBufferSize),表達式自動寫入此流 |
| session | HttpSession | 會話屬性存取(setAttribute/getAttribute)、生命週期控制(invalidate、setMaxInactiveInterval) |
| application | ServletContext | 應用層級共享資料、取得真實路徑(getRealPath)、寫日誌(log)、跨上下文轉發 |
| config | ServletConfig | 讀取 <init-param>、取得 Servlet 名稱與 ServletContext |
| pageContext | PageContext | 統一存取其他隱含對象、屬性作用域管理(PAGE/REQUEST/SESSION/APPLICATION_SCOPE)、轉發/包含工具方法 |
| page | Object (this) | 指向生成 Servlet 實例本身,非 Java 語言環境下才有意義,極少直接使用 |
僅在錯誤頁面(<%@ page isErrorPage="true" %>)可用,封裝拋出的 Throwable,提供 getMessage()、printStackTrace() 等診斷方法。
pageContext.getRequest() 等同 request,但前者可統一作用域操作,程式碼更可移植。response.sendRedirect() 前若已有內容寫入 out 且緩衝未滿,會拋 IllegalStateException;解決:調大 buffer 或改用 <jsp:forward>。<%@ page session="false" %> 後再用 session 會編譯報錯,適合靜態資源頁提升效能。application 屬性時需自行同步,或改用 ConcurrentHashMap 封裝。