servletcontext
·
一、ServletContext 核心概念
1. 定义
ServletContext 是 Web 应用全局上下文对象,由 Tomcat 服务器自动创建与管理。
- 一个 Web 项目 = 只存在唯一 1 个 ServletContext 对象
- 作用:代表整个 Web 应用,是项目的全局公共容器与配置工具
- 归属:Java Web 四大域对象中范围最大、生命周期最长的域对象
2. 核心本质
服务器启动加载当前项目 → 自动创建服务器关闭 / 项目卸载 → 自动销毁全程全局单例,所有用户、所有 Servlet、所有 JSP 共享同一个对象。
二、三大获取方式(完全等价,同一个对象)
java
运行
//方式1:Servlet 内置方法(最常用)
ServletContext context = getServletContext();
//方式2:通过 request 获取
ServletContext context = request.getServletContext();
//方式3:通过 ServletConfig 获取
ServletConfig config = getServletConfig();
ServletContext context = config.getServletContext();
三、四大核心功能 + 详细 API 解析
功能 1:全局域对象(数据共享)
作为全局作用域,实现整个项目内数据共享。
常用方法
java
运行
// 存入全局域
void setAttribute(String name, Object value);
// 取出全局域数据
Object getAttribute(String name);
// 移除全局域数据
void removeAttribute(String name);
特点
- 所有用户、所有会话、所有请求共享数据
- 数据直到服务器关闭或手动删除才失效
- 适合存放:网站统计、全局常量、公共配置
功能 2:读取【全局初始化参数】
配置在 web.xml 中,整个项目所有 Servlet 共用。
1)全局配置写法(web.xml)
xml
<!-- 全局上下文参数 -->
<context-param>
<param-name>adminName</param-name>
<param-value>系统管理员</param-value>
</context-param>
2)Java 读取代码
java
运行
//根据参数名获取全局参数
String name = context.getInitParameter("adminName");
//获取所有全局参数名称
Enumeration<String> paramNames = context.getInitParameterNames();
功能 3:获取项目路径 & 资源文件
实际开发高频用法,用来读取项目内部配置文件、文件上传路径等。
java
运行
//1. 获取项目上下文访问路径(虚拟路径)
String contextPath = context.getContextPath();
//2. 获取文件在服务器硬盘的真实绝对路径
String realPath = context.getRealPath("/");
//3. 以流形式读取项目内资源文件(推荐)
InputStream is = context.getResourceAsStream("/config/db.properties");
功能 4:服务器信息 & 日志操作
java
运行
//获取服务器版本与信息
String serverInfo = context.getServerInfo();
//输出服务器日志
context.log("系统启动成功");
四、ServletContext 完整生命周期
-
创建Tomcat 服务器启动、部署加载当前 Web 项目时,自动实例化唯一 ServletContext 对象。
-
运行存活项目运行期间一直常驻内存,不随请求、会话结束而销毁。
-
销毁
- 服务器正常关闭
- 项目手动卸载 / 移除
- 服务器异常重启
生命周期长短排序:ServletContext > HttpSession > HttpServletRequest > PageContext
五、作用域范围 深度解析
- HttpServletRequest:仅一次请求有效,请求结束立即销毁
- HttpSession:仅单个用户一次会话有效,浏览器关闭 / 超时销毁
- ServletContext:整个项目、全部用户、全部请求共享
适用场景
✅ 网站访问总人数统计✅ 系统全局固定配置(网站名称、版权、数据库公共参数)✅ 多个 Servlet 之间共享公共数据✅ 读取项目静态资源、配置文件
六、ServletContext 与 ServletConfig 详细对比
表格
| 对比维度 | ServletContext | ServletConfig |
|---|---|---|
| 作用范围 | 整个 Web 项目,全局 | 单个当前 Servlet 专属 |
| 对象数量 | 一个项目只有 1 个 | 每个 Servlet 单独 1 个 |
| 初始化参数 | 全局参数 <context-param> | Servlet 局部参数 <init-param> |
| 生命周期 | 跟随项目启停 | 跟随当前 Servlet 启停 |
| 主要用途 | 全局共享、读资源、全局配置 | 读取当前 Servlet 专属配置 |
一句话区分:
- ServletContext:全家公用
- ServletConfig:自己专用
七、优缺点详细分析
优点
- 全局唯一,跨 Servlet、跨用户数据共享
- 生命周期最长,数据可以长期保存
- 统一读取项目资源、全局配置,解耦代码
- 使用简单,任意位置快速获取
缺点
- 全局共享,多线程并发下存在线程安全问题
- 长期占用服务器内存,不适合存储大量大数据
- 数据一旦存入,不会自动清除,容易造成内存冗余
八、典型实战案例(理解加深)
案例:网站访问量统计
java
运行
//1.获取全局对象
ServletContext context = getServletContext();
//2.获取统计次数
Integer count = (Integer) context.getAttribute("visitCount");
if(count == null){
count = 1;
}else{
count++;
}
//3.重新存入全局域
context.setAttribute("visitCount",count);
//4.输出
response.getWriter().write("网站总访问人数:"+count);
只要服务器不关闭,所有用户访问都会累加统计。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)