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

Java Web 四大作用域詳解:application、session、request、page

     編輯:Java 綜合教學

為什麼要懂作用域?

數據在不同生命週期需要不同可見範圍。搞清四大域的「多大、幹什麼、怎麼用、為什麼」,是 Web 開發基本功。

對比總覽表

作用域對應對象生命週期/範圍典型用途
applicationServletContext整個 Web 應用 (容器啟動~關閉)全局配置、緩存、共享資源
sessionHttpSession一次會話 (默認 30 分鐘無操作失效)用戶登錄狀態、購物車、多步驟表單
requestServletRequest一次請求鏈 (含 forward)Controller → View 傳遞數據
pagePageContext單個 JSP 頁面渲染期間頁面級臨時變量、標籤協作

詳細解析

1. application (ServletContext)

  • 範圍最大,全應用共享同一實例 → 線程安全需自行處理 (用 ConcurrentHashMap 或同步)。
  • 代碼:application.setAttribute("key", val) / getAttribute("key")
  • 配置初始化參數:web.xml <context-param>
  • 讀取靜態資源:getResourceAsStream("/path")

2. session (HttpSession)

  • 每用戶一個,伺服器記憶體存儲,JSESSIONID 寫 Cookie 識別。
  • 常用:setAttribute/getAttribute、setMaxInactiveInterval(秒)、invalidate() 銷毀。
  • 配置超時:web.xml <session-config><session-timeout>30</session-timeout></session-config> (分鐘)。

3. request (ServletRequest)

  • 請求鏈共享 (forward 保持,redirect 失效)。
  • 核心:獲取客戶端信息 (URL、Header、參數、IP、端口)、setAttribute 傳遞數據到 JSP。
  • 生命週期:Service 方法前創建,響應結束銷毀。

4. page (PageContext)

  • 範圍最小,僅當前 JSP 頁面。
  • 「入口對象」:pageContext.getRequest()、getSession()、getServletContext() 可拿到其它八大隱式對象。
  • 跨域讀取:pageContext.getAttribute("key", scope),scope: 1=page, 2=request, 3=session, 4=application。
  • 查找優先級:findAttribute("key") 從 page→request→session→application 返回首個找到值。
  • 轉發/重定向快捷:pageContext.forward() / sendRedirect()。

實戰演示 JSP

<%@ page contentType="text/html;charset=UTF-8" %>
<%
  pageContext.setAttribute("name","地球");      // page
  request.setAttribute("name","太陽系");        // request
  session.setAttribute("name","銀河系");        // session
  application.setAttribute("name","宇宙");      // application
%>
page: <%=pageContext.getAttribute("name")%><br>
request: <%=pageContext.getRequest().getAttribute("name")%><br>
session: <%=pageContext.getSession().getAttribute("name")%><br>
application: <%=pageContext.getServletContext().getAttribute("name")%><br>
scope=1: <%=pageContext.getAttribute("name",1)%><br>
scope=2: <%=pageContext.getAttribute("name",2)%><br>
scope=3: <%=pageContext.getAttribute("name",3)%><br>
scope=4: <%=pageContext.getAttribute("name",4)%><br>
<% pageContext.removeAttribute("name",3); %>
session after remove: <%=session.getAttribute("name")%><br>
<% pageContext.setAttribute("name","多元宇宙",4); %>
application after set: <%=application.getAttribute("name")%><br>
findAttribute: <%=pageContext.findAttribute("name")%><br>
getAttributesScope: <%=pageContext.getAttributesScope("name")%><br>

輸出結果

page: 地球
request: 太陽系
session: 銀河系
application: 宇宙
scope=1: 地球
scope=2: 太陽系
scope=3: 銀河系
scope=4: 宇宙
session after remove: null
application after set: 多元宇宙
findAttribute: 地球
getAttributesScope: 1

核心選擇原則

  1. 數據需全應用可見 → application
  2. 2. 數據屬於單用戶、跨請求 → session 3. 數據僅本次請求鏈 (含 forward) → request 4. 數據僅本 JSP 頁面臨時用 → page

最小作用域原則:能用 request 別用 session,能用 session 別用 application,減少併發風險與記憶體佔用。

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