雖然現代 Java Web 開發多採 Spring MVC + 前後端分離架構,但 JSP 九大內建物件 (request, response, session, application...) 仍是 Servlet 容器運行時的核心抽象。深入理解它們的生命週期、作用域與常用 API,對排查傳統專案、閱讀舊代碼、甚至理解 Spring 底層機制都大有裨益。
| 特徵 | 說明 |
|---|---|
| 由容器自動實例化 | 開發者無需 new,JSP 編譯為 Servlet 時自動注入 |
| 作用域各異 | page < request < session < application |
| 僅在腳本元素中可用 | <% ... %>、<%= ... %>、<%@ page ... %> |
| 對應 Servlet API 類別 | 如 request → HttpServletRequest |
HttpServletRequest (請求作用域)封裝客戶端請求資訊:Header、Parameter、Cookie、Session ID、輸入流等。
// 參數獲取 (自動處理 GET/POST、編碼)
String name = request.getParameter("username");
String[] hobbies = request.getParameterValues("hobby"); // 多選框
// Header 與 Cookie
String ua = request.getHeader("User-Agent");
Cookie[] cookies = request.getCookies();
// 屬性傳遞 (RequestDispatcher forward 時常用)
request.setAttribute("key", obj);
Object val = request.getAttribute("key");
// 客戶端資訊
String ip = request.getRemoteAddr();
String url = request.getRequestURL().toString();
// 取得/建立 Session
HttpSession session = request.getSession(true); // true=不存在則建立
HttpServletResponse (回應作用域)控制 HTTP 回應:狀態碼、Header、Cookie、輸出流、重導向。
// 設定內容型別與編碼 (需在取得 writer/stream 前)
response.setContentType("application/json;charset=UTF-8");
// 寫入 Cookie
Cookie c = new Cookie("token", "abc123");
c.setMaxAge(3600); // 秒
c.setPath("/");
response.addCookie(c);
// 重導向 (客戶端跳轉,URL 變更)
response.sendRedirect("/login.jsp");
// 直接輸出二進位 (檔案下載、圖片)
try (OutputStream os = response.getOutputStream()) {
os.write(imageBytes);
}
HttpSession (會話作用域)跨請求保存用戶狀態。容器以 Cookie JSESSIONID 識別會話。
// 存取屬性 (值可為任意物件)
session.setAttribute("user", userObj);
User u = (User) session.getAttribute("user");
// 生命週期控制
session.setMaxInactiveInterval(30 * 60); // 30 分鐘無操作失效
int timeout = session.getMaxInactiveInterval(); // 取得秒數
// 銷毀會話 (登出)
session.invalidate();
// 判斷是否新會話
if (session.isNew()) { /* 首次訪問邏輯 */ }
ServletContext (應用作用域)全域共享、生命週期 = 容器啟動到關閉。所有用戶、所有請求共享同一實例。
// 全域配置、快取、計數器
application.setAttribute("onlineCount", 0);
application.getAttribute("configMap");
// 取得真實路徑 (部署後的絕對路徑)
String realPath = application.getRealPath("/WEB-INF/data.xml");
// 容器資訊
String serverInfo = application.getServerInfo(); // e.g. "Apache Tomcat/9.0.65"
int major = application.getMajorVersion(); // Servlet 版本主版本號
| 物件 | 類型 | 核心用途 |
|---|---|---|
| out | JspWriter | 模板文字輸出、緩衝區控制 (flush(), clear()) |
| pageContext | PageContext | 統一存取其他 8 大物件、作用域屬性管理、forward()、include() |
| config | ServletConfig | 讀取 web.xml 中 <init-param> 初始化參數 |
| page | Object (this) | 當前 JSP 頁面 Servlet 實例引用,極少直接使用 |
| exception | Throwable | 錯誤頁面 (isErrorPage="true") 才可用,捕獲未處理異常 |
RequestDispatcher)attr_ 避免與框架內部屬性衝突。@RequestParam ≈ request.getParameter(),@SessionAttributes ≈ session.setAttribute(),ServletContext 可注入 @Autowired ServletContext。