Skip to content

ServletContext 全局域对象与资源共享

ServletContext 是 Java Web 四大四大作用域中范围最大、生命周期最长的全局域对象。本文详解其核心概念、数据共享机制、全局配置获取及服务器真实路径映射。

1. ServletContext 概念与作用域地位

在 Java Web 开发中,存在四大作用域对象(用以在不同范围间传递与共享数据):

作用域对象作用范围生命周期
PageContext当前单个 JSP 页面内页面渲染结束即销毁
HttpServletRequest一次 HTTP 请求链中(包含请求转发)请求响应完成即销毁
HttpSession一次会话过程中(浏览器打开至关闭/超时)默认 30 分钟无交互或手动 invalidate
ServletContext整个 Web 应用程序(所有 Servlet 共享)服务器启动时创建,服务器关闭/重启时销毁

ServletContext 代表整个 Web 应用。在一个 Web 应用中,只有一个 ServletContext 实例对象,所有的 Servlet 都可以访问该对象并共享其数据。


2. 获取 ServletContext 实例的三种途径

在 Servlet 中,可以通过以下几种常用方式获取当前 Web 应用的 ServletContext 对象:

java
// 方式 1:直接通过 GenericServlet 提供的 getServletContext() 方法
ServletContext context1 = getServletContext();

// 方式 2:通过 ServletConfig 对象获取
ServletContext context2 = getServletConfig().getServletContext();

// 方式 3:通过 HttpServletRequest 请求对象获取
ServletContext context3 = req.getServletContext();

3. 全局数据共享(域对象属性操作 API)

由于 ServletContext 为整个 Web 项目共享,常用于存储全局统计数据、缓存或系统配置参数。

java
// 1. 向全局作用域绑定/存入数据
context.setAttribute("onlineCount", 100);
context.setAttribute("appName", "MallSystem");

// 2. 从全局作用域获取数据
Integer count = (Integer) context.getAttribute("onlineCount");

// 3. 从全局作用域移除数据
context.removeAttribute("appName");

4. 获取 Web 项目全局初始化参数

web.xml 中,可以在 <web-app> 根节点下配置属于整个应用的全局初始化参数

xml
<!-- 属于整个 Web 应用的全局参数 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

在任意 Servlet 中均可通过 ServletContext 读取:

java
ServletContext context = getServletContext();
String configLocation = context.getInitParameter("contextConfigLocation");
System.out.println("Spring 配置文件路径: " + configLocation);

5. 获取服务器磁盘真实路径 (getRealPath)

在开发中,经常需要读取项目部署在服务器上的文件(如上传的图片、Excel 模版等)。由于应用最终解压运行在 Tomcat 的 webapps 或临时路径下,绝不能使用硬编码的盘符路径(如 D:/...)

ServletContext.getRealPath() 可以根据相对 Web 应用根目录的路径,自动解析出服务器磁盘上的绝对物理路径

java
ServletContext context = getServletContext();

// 1. 获取 Web 应用部署在服务器上的根目录物理路径
String realPath = context.getRealPath("/");
// 输出示例: D:\tomcat\webapps\my-app\

// 2. 获取 WEB-INF/classes/ 目录下资源的真实路径
String filePath = context.getRealPath("/WEB-INF/classes/db.properties");

// 3. 读取为文件输入流
InputStream is = context.getResourceAsStream("/WEB-INF/config.properties");

基于 VitePress 构建 | 技术知识库