HttpServletRequest vs ServletContext 全面解析

HttpServletRequest vs ServletContext 全面解析

一、 核心區別概覽

特性HttpServletRequest (請求對象)ServletContext (Servlet上下文/應用對象)
作用域請求范圍應用范圍
生命周期從客戶端發出請求開始,到服務器返回響應結束。從Web應用啟動(部署)開始,到應用停止或卸載結束。
主要用途獲取單次請求的相關信息:參數、頭信息、請求體等。獲取整個Web應用的全局初始化參數、共享全局屬性、獲取資源路徑等。
數據共享在一次請求鏈中共享數據(可用于請求轉發)。在整個Web應用的所有會話和所有請求中共享數據。
線程安全 (每個請求由獨立的線程處理,擁有獨立的request對象) (所有線程共享同一個ServletContext實例,需自行保證線程安全)
如何獲取service(HttpServletRequest req, ...) 方法參數直接獲取。通過 request.getServletContext()getServletConfig().getServletContext() 獲取。

二、 詳細解釋與代碼示例

1. HttpServletRequest - 請求對象

它代表了客戶端的一次HTTP請求。服務器會為每一個到達的HTTP請求創建一個新的 HttpServletRequest 對象,并用它來包裝所有來自客戶端的數據(如參數、頭部、IP地址等)。當服務器對該請求做出響應后,這個對象就會被銷毀。

常用方法:

  • String getParameter(String name):獲取請求參數。
  • void setAttribute(String name, Object o):在請求范圍內設置屬性。
  • Object getAttribute(String name):獲取請求范圍內設置的屬性。
  • RequestDispatcher getRequestDispatcher(String path):獲取請求轉發器。
  • Cookie[] getCookies():獲取客戶端發送的Cookies。
  • HttpSession getSession():獲取或創建與當前請求關聯的會話。

典型用例:

  • 獲取表單提交的 usernamepassword
  • 在Controller(Servlet)中處理業務邏輯,將結果數據(如一個 User 對象)通過 setAttribute 放入request,然后轉發(Forward) 給JSP頁面顯示。
  • 獲取客戶端的IP地址或瀏覽器類型。

示例代碼:

// 在Servlet的doPost方法中
protected void doPost(HttpServletRequest request, HttpServletResponse response) {// 1. 獲取單次請求的參數String username = request.getParameter("username");// 2. 進行業務處理(例如:查詢數據庫)UserService userService = new UserService();User user = userService.findUserByUsername(username);// 3. 將數據存入Request作用域,以便傳遞給JSPrequest.setAttribute("user", user);// 4. 將請求轉發給showUser.jsp頁面// 注意:轉發是服務器內部行為,是一次請求,URL地址欄不變RequestDispatcher dispatcher = request.getRequestDispatcher("/showUser.jsp");dispatcher.forward(request, response);// 請求結束后,request對象及其中的attribute將被回收
}

showUser.jsp 中,你可以使用EL表達式獲取數據:

<h1>用戶信息:${user.name}</h1>

2. ServletContext - 應用上下文對象

每個Web應用有且只有一個 ServletContext 對象。它在Web應用部署啟動時被創建,在整個應用運行期間都有效,所有用戶(所有會話)的所有請求都可以訪問它。因此,它通常用于存放整個應用的全局配置信息或需要被所有用戶共享的數據。

常用方法:

  • void setAttribute(String name, Object object):在整個應用范圍內設置屬性。
  • Object getAttribute(String name):獲取應用范圍內的屬性。
  • String getInitParameter(String name):獲取在 web.xml 中配置的全局初始化參數。
  • String getRealPath(String path):獲取資源在服務器文件系統上的真實路徑。

典型用例:

  • 存儲整個應用的全局計數器。
  • 存放數據庫連接池(或獲取數據源的對象)。
  • web.xml 讀取數據庫JDBC URL、用戶名等配置信息。
  • 在應用啟動時加載一些耗時的資源(如配置文件),并緩存起來供所有組件使用。

示例代碼:

1. 在 web.xml 中配置全局參數:

<context-param><param-name>jdbcUrl</param-name><param-value>jdbc:mysql://localhost:3306/my_database</param-value>
</context-param>
<context-param><param-name>adminEmail</param-name><param-value>admin@example.com</param-value>
</context-param>

2. 在Servlet或監聽器中使用:

// 在任何Servlet或Listener中都可以獲取
public class AppInitListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {// 應用啟動時,獲取Context并加載全局配置ServletContext context = sce.getServletContext();// 從web.xml讀取配置String jdbcUrl = context.getInitParameter("jdbcUrl");String adminEmail = context.getInitParameter("adminEmail");// 模擬初始化一個連接池,并放入ApplicationScopeDataSource dataSource = createDataSource(jdbcUrl);context.setAttribute("dataSource", dataSource);context.setAttribute("adminEmail", adminEmail);System.out.println("應用程序已啟動,全局資源已加載...");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// 應用關閉時,清理資源System.out.println("應用程序已關閉...");}private DataSource createDataSource(String url) { ... }
}// 在另一個處理業務的Servlet中
protected void doGet(HttpServletRequest request, HttpServletResponse response) {// 從ApplicationScope中獲取連接池ServletContext context = request.getServletContext();DataSource dataSource = (DataSource) context.getAttribute("dataSource");String adminEmail = (String) context.getAttribute("adminEmail");// 使用dataSource獲取連接,操作數據庫...try (Connection conn = dataSource.getConnection()) {// ... 數據庫操作}
}

三、 總結與類比

場景使用的對象
用戶A登錄,需要驗證其賬號密碼HttpServletRequest (獲取username,password參數)
將用戶A的個人信息展示在頁面上HttpServletRequest (通過setAttribute,然后轉發給JSP)
網站底部需要顯示管理員郵箱(來自配置)ServletContext (從context-param讀取,所有頁面共用)
統計網站的在線訪問人數ServletContext (所有用戶共享一個計數器) 注意線程安全
用戶A將商品加入購物車HttpSession (會話范圍,下次會詳細講解)

記住這個簡單的比喻:

  • HttpServletRequest 就像你今天收到的一封快遞,拆開后處理完,包裝盒就扔掉了。
  • ServletContext 就像你家里的公共布告欄,所有人都能看到上面的信息,并且信息會長期貼在上面。
  • HttpSession (下次可能會問) 就像快遞站給你一個專屬的儲物柜,在接下來一段時間內,只有你能用這個柜子存東西取東西。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96396.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96396.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96396.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java后端工程師如何學AI

Java后端工程師如何學AI 目錄 前言為什么Java后端工程師要學習AIAI學習路徑規劃基礎知識體系實踐項目建議學習資源推薦學習時間規劃常見問題與解決方案職業發展建議總結 前言 隨著人工智能技術的快速發展&#xff0c;AI已經不再是計算機科學專業的專屬領域。作為Java后端工…

Django REST Framework 中 @action 裝飾器詳解

概述 action 裝飾器是 Django REST Framework (DRF) 中 ViewSet 的一個核心功能&#xff0c;用于定義自定義路由方法。它允許開發者在標準的 CRUD 操作&#xff08;list、create、retrieve、update、destroy&#xff09;之外&#xff0c;創建符合特定業務需求的接口&#xff0c…

【重磅更新】RetroBoard 全面升級,讓敏捷回顧更高效、更安全、更貼心!

??????? ??????? ??????? ??????? ??????? ??????? ??????? ??????? ??????? ??????? ??????? ???????…

中州養老:華為云設備管理接口開發全流程

需求分析點擊同步數據時,要把華為云的數據拉取到我們的系統中對于新增設備操作,實際上這些參數與華為云產品我們添加設備時的參數是一樣的表結構設計E-R圖數據庫字段接口分析對于設備中的數據,我們既要再IOT平臺存儲,又要在數據庫中存儲.之所以保存兩份數據的原因:IOT平臺中只是…

Llama-Factory微調Qwen2.5-VL從數據集制作到部署記錄

Llama-Factory微調Qwen2.5-VL從數據集制作到部署記錄 電腦環境配置&#xff1a; 1.ubuntu24 2.3090(24G) 3.Cuda12.9 一、數據集制作 我的數據集主要是對圖像內容進行描述 1.Label-studio制作數據集 這是最原始的從零開始制作數據集的方法&#xff0c;不建議這樣做&#xff01;…

【藍橋杯真題67】C++數位和為偶數的數 第十五屆藍橋杯青少年創意編程大賽 算法思維 C++編程選拔賽真題解

C++數位和為偶數的數 第十五屆藍橋杯青少年創意編程大賽C++選拔賽真題 博主推薦 所有考級比賽學習相關資料合集【推薦收藏】 1、C++專欄 電子學會C++一級歷年真題解析 電子學會C++二級歷年真題解析

【計算機網絡 | 第11篇】寬帶接入技術及其發展歷程

文章目錄寬帶接入技術詳解數字傳輸系統技術演進早期電話網的傳輸技術演變數字傳輸系統技術演進&#xff1a;從碎片到統一寬帶接入技術 ADSLADSL的基本原理與非對稱特性DMT調制技術&#xff1a;多子信道并行傳輸ADSL接入網組成電話分離器的設計原理與優勢ADSL的升級&#xff1a;…

(論文速讀)SCSegamba:用于結構裂紋分割的輕量級結構感知視覺曼巴

論文題目&#xff1a;SCSegamba: Lightweight Structure-Aware Vision Mamba for Crack Segmentation in Structures&#xff08;用于結構裂紋分割的輕量級結構感知視覺曼巴&#xff09;會議&#xff1a;CVPR2025摘要&#xff1a;不同場景下的結構裂縫像素級分割仍然是一個相當…

《蘇超風云》亮相時尚大賞,成短劇行業發展新風向

當男頻短劇憑借《一品布衣》五天橫掃10億播放的數據宣告逆襲&#xff0c;短劇市場格局正經歷深刻洗牌。風口之下&#xff0c;頭條視聽、中皋文旅、國內時尚視覺與短視頻創作領域的頭部廠牌“大灣視頻”攜手下場&#xff0c;打造精品男頻短劇《蘇超風云》&#xff0c;劍指2025年…

HTML5新年元旦網站源碼

新年主題網站開發概述 本項目基于HTML5、CSS3與JavaScript技術棧&#xff0c;打造了一個功能豐富、交互體驗流暢的新年主題網站&#xff0c;涵蓋文化展示、互動娛樂與社交分享三大核心模塊&#xff0c;通過現代化前端技術實現沉浸式節日氛圍營造。 1.1、核心功能架構 網站采…

CentOS 7 下iscsi存儲服務配置驗證

一、環境說明 centos7服務器*2服務器ip&#xff1a;服務端10.10.10.186 客戶端10.10.10.184服務端存儲卷sda1提前關閉防火墻&#xff0c;或開放默認 iSCSI 使用 3260 端口 二、服務端&#xff08;Target&#xff09;配置 安裝 iSCSI target 服務 yum install -y targetcli syst…

立即數、棧、匯編與C函數的調用

一、立即數在 ARM 架構中&#xff0c;立即數是指在指令中直接編碼的常量值&#xff0c;而不是通過寄存器或內存引用的值立即數的特點編碼限制&#xff1a;ARM指令是固定長度的&#xff08;32位&#xff09;&#xff0c;因此立即數不能占用太多位數。典型的算術和邏輯指令通常只…

貪心算法與動態規劃:數學原理、實現與優化

貪心算法與動態規劃&#xff1a;數學原理、實現與優化 引言&#xff1a;算法選擇的本質 在計算機科學領域&#xff0c;算法選擇的本質是對問題特征的數學建模與求解策略的匹配。貪心算法與動態規劃作為兩種經典的優化算法&#xff0c;分別在不同問題域展現出獨特優勢。本文將從…

Leetcode 刷題記錄 21 —— 技巧

Leetcode 刷題記錄 21 —— 技巧 本系列為筆者的 Leetcode 刷題記錄&#xff0c;順序為 Hot 100 題官方順序&#xff0c;根據標簽命名&#xff0c;記錄筆者總結的做題思路&#xff0c;附部分代碼解釋和疑問解答&#xff0c;01~07為C語言&#xff0c;08及以后為Java語言&#xf…

Android Studio Meerkat | 2024.3.1 Gradle Tasks不展示

把這兩個開關打開&#xff0c;然后刷新gradle文件

Java中方法重寫與重載的區別

目錄 1. 方法重載 (Overload) 什么是方法重載&#xff1f; 重載的特點&#xff1a; 重載的示例&#xff1a; 重載的調用&#xff1a; 2. 方法重寫 (Override) 什么是方法重寫&#xff1f; 重寫的特點&#xff1a; 重寫的示例&#xff1a; 重寫的調用&#xff1a; 3.…

微信小程序發送訂閱消息-一次訂閱,一直發送消息。

實現思路長期訂閱要求太高&#xff0c;需要政府、公共交通等單位才有資格&#xff0c;所以只能使用一次性訂閱。 就像是買奶茶&#xff0c;下單以后&#xff0c;會彈出讓用戶訂閱消息那種。以買奶茶為例:用戶第一次下單成功&#xff0c;點擊了訂閱消息。&#xff08;一般都有三…

408 Request Timeout:請求超時,服務器等待客戶端發送請求的時間過長。

408 Request Timeout 是 HTTP 狀態碼之一&#xff0c;表示客戶端在發送請求時&#xff0c;服務器等待的時間過長&#xff0c;最終放棄了處理該請求。此問題通常與網絡延遲、客戶端配置、服務器設置或者應用程序的性能有關。1. 常見原因1.1 客戶端問題網絡連接延遲或不穩定&…

MongoDB面試集錦

該書的使用的MongoDB版本是 4.2.01、什么是NoSQL數據庫&#xff1f;NoSQL和RDBMS有什么區別&#xff1f;在那些情況下使用和不使用NoSQL數據庫&#xff1f;NoSQL是非關系型數據庫&#xff0c;NoSQLNot Only SQL 。關系型數據庫采用的是結構化的數據&#xff0c;NoSQL采用的是鍵…

直擊JVM面試題

JVM組成 JVM JVM 就是 Java 程序的運行環境&#xff0c;它通過 類加載、字節碼執行、內存管理、GC、線程調度 等機制&#xff0c;讓 Java 實現了 跨平臺、自動內存管理和高效執行。 它是一個抽象的計算機&#xff0c;能執行以 字節碼&#xff08;.class 文件&#xff09; 為單…