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

JSP 九大隱式對象深度解析:作用域、流控、日誌、I/O 與初始化參數

     編輯:J2ME

前言:JSP 容器送你的九件「瑞士軍刀」

JSP 頁面翻譯為 Servlet 時,容器自動聲明九個隱式對象,無需 import、無需 new,直接在 scriptlet/表達式中使用。它們封裝了 ServletContext、HttpSession、HttpServletRequest/Response、JspWriter、PageContext、ServletConfig、異常對象,讓頁面作者專注於表現邏輯。本文按功能分類逐一拆解。

一、 九大對象速查表

對象類型作用域核心用途
applicationServletContextApplication全局屬性、資源路徑、RequestDispatcher、日誌
configServletConfigPage初始化參數 (web.xml <init-param>)
exceptionThrowablePage錯誤頁面專用,封裝拋出的異常
outJspWriterPage輸出流,print/println、緩衝控制
pageObject (this)Page當前頁面實例,極少直接用
pageContextPageContextPage統一屬性管理 API、轉發/包含、獲取其它隱式對象
requestHttpServletRequestRequest請求參數、Header、屬性、轉發/包含入口
responseHttpServletResponsePage設置 Header、Content-Type、重定向、Cookie
sessionHttpSessionSession用戶會話屬性、登錄狀態、購物車

二、 作用域管理:四大隱式對象的屬性操作

所有隱式對象均提供 setAttribute(name, value) / getAttribute(name) / removeAttribute(name),但可見範圍不同:

作用域對象生命週期典型場景
pagepageContext單次請求處理期間標籤處理器臨時數據、頁面級緩存
requestrequest一次 HTTP 請求(含轉發鏈)Controller → JSP 傳遞模型數據、表單回顯
sessionsession用戶會話(默認 30 分鐘無操作失效)登錄用戶信息、購物車、向導式流程中間狀態
applicationapplicationWeb 應用生命週期(重啟失效)全局配置、緩存數據字典、計數器、DataSource

最佳實踐:優先用 page → request → session → application,最小化作用域,減少併發衝突與內存洩漏。

三、 流控制:forward 與 include

均通過 RequestDispatcher 實現,獲取途徑多樣(application.getRequestDispatcher()、pageContext.getRequestDispatcher() 等)。

<%-- forward:控制權轉移,當前頁不再輸出 --%>
<%
    RequestDispatcher rd = application.getRequestDispatcher("/next.jsp");
    rd.forward(request, response);
%>

<%-- include:輸出合併,當前頁繼續執行 --%>
<%
    RequestDispatcher rd = application.getRequestDispatcher("/header.jsp");
    rd.include(request, response);
%>

區別:forward 前不可提交響應;include 適合頁首/頁尾/導航欄片段複用。

四、 日誌與異常處理

1. 容器日誌

<%-- 簡單文本 --%>
<% application.log("用戶登錄: " + userId); %>

<%-- 異常+文本 --%>
<% application.log("DB 連接失敗", e); %>

實現由容器決定(文本文件、數據庫、Syslog),查閱服務器文檔定位日誌路徑。

2. 聲明錯誤頁面

<%-- 業務頁 --%>
<%@ page errorPage="error.jsp" %>

<%-- error.jsp --%>
<%@ page isErrorPage="true" import="java.io.*" %>
<%
    // exception 隱式對象自動可用
    application.log("頁面異常", exception);
%>

系統繁忙,請稍後重試

<%= exception.getMessage() %>

五、 I/O 控制:request / response / out

  • request:getParameter()、getHeader()、getCookies()、getInputStream() 讀取原始體。
  • response:setContentType()、setHeader()、addCookie()、sendRedirect()。注意:不可直接調用 getWriter()/getOutputStream(),JSP 已佔用。
  • out:JspWriter(緩衝 PrintWriter),print()/println()/clear()/flush()。自定義標籤處理器、大段 HTML 混雜邏輯時直接用 out 更清晰。

六、 初始化參數:config 對象

在 web.xml 中為 JSP/Servlet 定義:

<servlet>
  <servlet-name>MyJsp</servlet-name>
  <jsp-file>/my.jsp</jsp-file>
  <init-param>
    <param-name>contactEmail</param-name>
    <param-value>admin@example.com</param-value>
  </init-param>
</servlet>

頁面中讀取:

<%
    String email = config.getInitParameter("contactEmail");
    Enumeration names = config.getInitParameterNames();
    while (names.hasMoreElements()) {
        String n = (String) names.nextElement();
        out.println(n + "=" + config.getInitParameter(n));
    }
%>

所有值為 String,需自行轉型(Integer.parseInt 等)。

七、 總結與避坑指南

  1. 不重複聲明:隱式對象名為保留字,不可作為變量名。
  2. session 不要濫用:大對象放 session 易致內存洩漏,及時 removeAttribute 或 invalidate()。
  3. forward 前不得輸出**:哪怕一個空白字符也會導致 IllegalStateException。
  4. 錯誤頁面必須 isErrorPage="true"**,否則 exception 不可用。
  5. response 提交後不可 forward/include/setHeader**,檢查 response.isCommitted()。

善用九大隱式對象,能寫出結構清晰、職責分離、易於維護的 JSP 應用。

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