首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JSP 九大內置對象完整詳解與最佳實踐

     編輯:Java 相關知識

九大內置對象總覽

對象類型作用域核心用途
requestHttpServletRequest請求獲取參數、Header、屬性、轉發
responseHttpServletResponse頁面設置狀態、Header、Cookie、重定向、輸出流
sessionHttpSession會話用戶狀態、購物車、登錄態、屬性存取
applicationServletContext應用全局配置、緩存、計數器、資源路徑
outJspWriter頁面輸出內容到瀏覽器、緩衝區控制
pageContextPageContext頁面訪問所有內置對象、屬性作用域管理、異常處理
configServletConfig頁面初始化參數、ServletContext 獲取
pageObject (this)頁面當前 JSP 頁面實例,極少直接使用
exceptionThrowable頁面錯誤頁面獲取異常信息(需 isErrorPage=true)

核心對象深度解析

1. request - 請求處理核心

<!-- 獲取參數 -->
${param.username} <!-- EL 表達式推薦 -->
<%= request.getParameter("username") %>

<!-- 設置屬性供轉發頁面使用 -->
<% request.setAttribute("user", user); %>

<!-- 獲取 Header -->
${header['User-Agent']}

<!-- 請求轉發 -->
<% request.getRequestDispatcher("/detail.jsp").forward(request, response); %>

中文亂碼解決:request.setCharacterEncoding("UTF-8")(必須在讀取參數前調用)。

2. response - 響應控制

<!-- 重定向 -->
<% response.sendRedirect("/login.jsp"); %>

<!-- 設置 Content-Type -->
<% response.setContentType("application/json;charset=UTF-8"); %>

<!-- 設置 Cookie -->
<% 
    Cookie c = new Cookie("token", "abc123");
    c.setMaxAge(3600);
    c.setPath("/");
    response.addCookie(c);
%>

<!-- 直接輸出 -->
<% response.getWriter().write("{\"code\":200}"); %>

3. session - 會話管理

<!-- 存取屬性 -->
<% session.setAttribute("loginUser", user); %>
${sessionScope.loginUser.name}

<!-- 判斷新會話 -->
<% if (session.isNew()) { ... } %>

<!-- 設置超時(秒) -->
<% session.setMaxInactiveInterval(1800); %> <!-- 30分鐘 -->

<!-- 銷毀 -->
<% session.invalidate(); %>

原理:Server 分配 JSESSIONID,客戶端 Cookie 攜帶,Server 內存/Redis 存儲數據。

4. application - 全局共享

<%-- 初始化緩存(通常在 ServletContextListener 中) --%>
<% application.setAttribute("configMap", loadConfig()); %>

<%-- 讀取 --%>
${applicationScope.configMap.siteName}

<%-- 獲取真實路徑 --%>
<% String path = application.getRealPath("/WEB-INF/data.txt"); %>

5. out - 輸出流控制

<% out.print("Hello"); %>
<% out.println("World"); %>
<% out.clear(); %> <!-- 清空緩衝區 -->
<% out.flush(); %> <!-- 強制刷新 -->

注意:out 是 JspWriter,帶緩衝區,異於 response.getWriter()(直接輸出)。

6. pageContext - 萬能訪問器

<%-- 獲取其他內置對象 --%>
<% 
    HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
    HttpSession sess = pageContext.getSession();
    ServletContext app = pageContext.getServletContext();
    JspWriter out = pageContext.getOut();
%>

<%-- 屬性作用域操作 --%>
<% pageContext.setAttribute("key", "val", PageContext.REQUEST_SCOPE); %>
<% Object val = pageContext.findAttribute("key"); %> <!-- 按優先級查找 -->

<%-- 包含/轉發 --%>
<% pageContext.include("/fragment.jsp"); %>
<% pageContext.forward("/target.jsp"); %>

7. config - 初始化配置

<!-- web.xml 中配置 -->
<servlet>
    <init-param>
        <param-name>adminEmail</param-name>
        <param-value>admin@example.com</param-value>
    </init-param>
</servlet>

<% String email = config.getInitParameter("adminEmail"); %>

8. exception - 錯誤處理

<%-- errorPage.jsp (page 指令 isErrorPage="true") --%>
<%@ page isErrorPage="true" import="java.io.PrintWriter" %>
<h1>系統錯誤</h1>
<pre><% exception.printStackTrace(new PrintWriter(out)); %></pre>

<%-- 正常頁面指定錯誤頁 --%>
<%@ page errorPage="errorPage.jsp" %>

作用域優先級與查找順序

pageContext.findAttribute("name") 
// 等價於依次查找:
// 1. PageScope (pageContext)
// 2. RequestScope (request)
// 3. SessionScope (session)
// 4. ApplicationScope (application)
// 找到即返回,否則 null

現代開發建議:儘量少用 Scriptlet

  • ✅ 使用 EL 表達式 (${...}) 訪問數據
  • ✅ 使用 JSTL 標簽 (<c:if>, <c:forEach>) 控制邏輯
  • ✅ 業務邏輯移至 Controller/Service,JSP 僅負責展示
  • ❌ 避免 <% ... %> 大段 Java 代碼

總結

九大內置對象是 JSP 隱式提供的便利工具,理解其類型、作用域、核心 API、相互關係是掌握 JSP 開發的基礎。現代項目建議:Controller 處理邏輯 → Model 裝載數據 → JSP/Thymeleaf 純展示,內置對象主要在遷移老項目或簡單頁面中直接使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved