JSP 容器自動實例化九大內建物件,開發者無需聲明即可直接在腳本片段或表達式中使用。掌握其類型、功能與作用域,是編寫健壯 JSP 頁面的基礎。
| 物件 | 類型 | 核心功能 | 作用域 |
|---|---|---|---|
| request | HttpServletRequest | 封裝客戶端 HTTP 請求數據(參數、Header、Body) | 請求級 |
| response | HttpServletResponse | 封裝伺服器 HTTP 回應(狀態碼、Header、輸出流) | 頁面級 |
| out | JspWriter | 向客戶端輸出字符流,支援緩衝區控制 | 頁面級 |
| session | HttpSession | 維護用戶會話狀態,跨請求共享數據 | 會話級 |
| application | ServletContext | 整個 Web 應用全域共享數據、資源與配置 | 應用級 |
| pageContext | PageContext | 管理頁面屬性、協調各作用域、提供轉向/包含等工具方法 | 頁面級 |
| config | ServletConfig | 獲取 Servlet 初始化參數(web.xml <init-param>) | 頁面級 |
| page | Object (this) | 當前 JSP 實現類實例,僅在頁面內合法 | 頁面級 |
| exception | Throwable | 僅在錯誤頁面(isErrorPage="true")可用,封裝拋出的異常 | 頁面級 |
request.getParameter() 獲取表單/查詢字符串參數request.setAttribute() 在請求鏈中傳遞對象(配合 RequestDispatcher)response.sendRedirect() 客戶端重定向;RequestDispatcher.forward() 伺服器端轉發response.setContentType() 設定 MIME 型別與字符編碼setAttribute/getAttribute、invalidate() 銷毀、setMaxInactiveInterval() 設定超時getInitParameter() 讀取 web.xml <context-param>findAttribute(name) 依序搜尋 page→request→session→applicationsetAttribute(name, value, scope) 指定作用域存儲forward/include() 替代 <jsp:forward/include>getRequest()/getResponse()/getSession()/getServletContext() 獲取其他內建物件<!-- 正常頁面 -->
<%@ page errorPage="error.jsp" %>
<!-- error.jsp -->
<%@ page isErrorPage="true" %>
<h1>系統錯誤</h1>
<p><%= exception.getMessage() %></p>
<pre><% exception.printStackTrace(new java.io.PrintWriter(out)); %></pre>
| 作用域 | 生命週期 | 適用場景 | 線程安全 |
|---|---|---|---|
| page | 單次請求處理期間 | 頁面內臨時變量、標籤間傳值 | 是(單線程) |
| request | 一次 HTTP 請求(含轉發) | Controller→View 數據傳遞、攔截器鏈共享 | 是 |
| session | 用戶會話期間(默認 30 分鐘無操作失效) | 登入用戶資訊、購物車、多步驟向導數據 | 否(需同步) |
| application | Web 應用啟動至關閉 | 全域配置、緩存、計數器、共享資源 | 否(需同步) |
ConcurrentHashMap。isErrorPage="true" 並友善提示,避免堆疊跡露敏感信息。${requestScope.xxx})與 JSTL 替代 Scriptlet,提升可讀性與安全性。九大內建物件是 JSP 與 Servlet 容器交互的基石。深入理解其類型、作用域與線程特性,能避免常見併發 Bug 與記憶體問題,編寫出高效、可維護的 Web 頁面。