JSP 容器在翻譯階段自動提供九大隱式物件,免去手動創建。本文系統梳理 pageContext 核心角色、四大作用域選擇原則、JSP 映射配置與 MVC 分工模式。
pageContext 是 PageContext 類別實例,提供兩大核心功能:
| 方法 | 對應隱式物件 | 類型 |
|---|---|---|
| getException() | exception | Throwable |
| getPage() | page | Object (this) |
| getRequest() | request | HttpServletRequest |
| getResponse() | response | HttpServletResponse |
| getServletConfig() | config | ServletConfig |
| getServletContext() | application | ServletContext |
| getSession() | session | HttpSession |
| getOut() | out | JspWriter |
// 設定屬性
pageContext.setAttribute("key", value, PageContext.REQUEST_SCOPE);
pageContext.setAttribute("key", value, PageContext.SESSION_SCOPE);
pageContext.setAttribute("key", value, PageContext.APPLICATION_SCOPE);
pageContext.setAttribute("key", value, PageContext.PAGE_SCOPE); // 預設
// 取得屬性(自動按 PAGE→REQUEST→SESSION→APPLICATION 順序查找)
Object val = pageContext.getAttribute("key");
// 移除屬性
pageContext.removeAttribute("key", PageContext.SESSION_SCOPE);
| 作用域 | 對應物件 | 生命週期 | 可見範圍 | 典型用途 |
|---|---|---|---|---|
| Page | pageContext | 請求開始→響應結束 | 當前 JSP 頁面 | 頁面級暫存資料、標籤庫協作 |
| Request | request | 請求開始→響應結束(含 forward) | 同一請求鏈(含轉發) | Controller 傳遞資料給 View、表單回顯 |
| Session | session | 瀏覽器關閉/超時失效 | 同一用戶多請求 | 登入狀態、購物車、用戶偏好 |
| Application | application (ServletContext) | 容器啟動→關閉 | 全應用所有用戶 | 全域配置、快取、計數器 |
在 web.xml 中以 <jsp-file> 替代 <servlet-class>,可為 JSP 定義 URL 模式、初始化參數:
<servlet>
<servlet-name>index</servlet-name>
<jsp-file>/index.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>index</servlet-name>
<url-pattern>/jsp/*</url-pattern>
</servlet-mapping>
效果:訪問 /jsp/xxx 實際執行 /index.jsp,支援前綴路由、隱藏真實路徑。
request.setAttribute、RequestDispatcher.forward 轉發。// Servlet 範例
@WebServlet("/user/list")
public class UserListServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List users = userService.findAll();
req.setAttribute("users", users);
req.getRequestDispatcher("/WEB-INF/views/user/list.jsp").forward(req, resp);
}
}
JSP 中直接用 ${users}、<c:forEach> 迭代顯示。
| 物件 | 類型 | 作用域 | 主要用途 |
|---|---|---|---|
| pageContext | PageContext | page | 統一入口、作用域操作 |
| request | HttpServletRequest | request | 獲取參數、Header、屬性 |
| response | HttpServletResponse | page | 設定狀態碼、Header、輸出 |
| session | HttpSession | session | 會話狀態管理 |
| application | ServletContext | application | 全域資源、初始化參數 |
| config | ServletConfig | page | Servlet 初始化參數 |
| out | JspWriter | page | 輸出內容到響應體 |
| page | Object | page | 當前 Servlet 實例(this) |
| exception | Throwable | page | 錯誤頁面獲取異常 |
掌握九大隱式物件與四大作用域,是編寫乾淨、可維護 JSP 的基礎。配合 web.xml 映射與 Servlet/JSP 分工,可構建清晰的 MVC 架構,為後續引入 Spring MVC、Thymeleaf 等現代框架打下堅實基礎。