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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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; 为单…