一、ServletContext 核心概念

1. 定义

ServletContextWeb 应用全局上下文对象,由 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);
特点
  1. 所有用户、所有会话、所有请求共享数据
  2. 数据直到服务器关闭或手动删除才失效
  3. 适合存放:网站统计、全局常量、公共配置

功能 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 完整生命周期

  1. 创建Tomcat 服务器启动、部署加载当前 Web 项目时,自动实例化唯一 ServletContext 对象。

  2. 运行存活项目运行期间一直常驻内存,不随请求、会话结束而销毁。

  3. 销毁

  • 服务器正常关闭
  • 项目手动卸载 / 移除
  • 服务器异常重启

生命周期长短排序:ServletContext > HttpSession > HttpServletRequest > PageContext


五、作用域范围 深度解析

  1. HttpServletRequest:仅一次请求有效,请求结束立即销毁
  2. HttpSession:仅单个用户一次会话有效,浏览器关闭 / 超时销毁
  3. ServletContext整个项目、全部用户、全部请求共享

适用场景

✅ 网站访问总人数统计✅ 系统全局固定配置(网站名称、版权、数据库公共参数)✅ 多个 Servlet 之间共享公共数据✅ 读取项目静态资源、配置文件


六、ServletContext 与 ServletConfig 详细对比

表格

对比维度ServletContextServletConfig
作用范围整个 Web 项目,全局单个当前 Servlet 专属
对象数量一个项目只有 1 个每个 Servlet 单独 1 个
初始化参数全局参数 <context-param>Servlet 局部参数 <init-param>
生命周期跟随项目启停跟随当前 Servlet 启停
主要用途全局共享、读资源、全局配置读取当前 Servlet 专属配置

一句话区分:

  • ServletContext:全家公用
  • ServletConfig:自己专用

七、优缺点详细分析

优点

  1. 全局唯一,跨 Servlet、跨用户数据共享
  2. 生命周期最长,数据可以长期保存
  3. 统一读取项目资源、全局配置,解耦代码
  4. 使用简单,任意位置快速获取

缺点

  1. 全局共享,多线程并发下存在线程安全问题
  2. 长期占用服务器内存,不适合存储大量大数据
  3. 数据一旦存入,不会自动清除,容易造成内存冗余

八、典型实战案例(理解加深)

案例:网站访问量统计

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);

只要服务器不关闭,所有用户访问都会累加统计。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐