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