在学习Servlet开发时,ServletContext
是一个重要的概念。它表示的是整个Web应用程序的上下文环境,用于与服务器进行交互。
ServletContext是什么?
- ServletContext对象有称呼为上下文对象,或者叫应用域对象(后面统一讲解域对象);
- 容器会为每个app创建一个独立的唯一的ServletContext对象;
- ServletContext对象为所有的Servlet所共享;
- ServletContext可以为所有的Servlet提供初始配置参数
配置 ServletContext参数
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"version="5.0"><context-param><param-name>paramA</param-name><param-value>valueA</param-value></context-param><context-param><param-name>paramB</param-name><param-value>valueB</param-value></context-param>
</web-app>
在Servlet中获取ServletContext并获取参数
public class ServletA extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 从ServletContext中获取为所有的Servlet准备的参数ServletContext servletContext = this.getServletContext();// 获取单个初始化参数String valueA = servletContext.getInitParameter("paramA");System.out.println("paramA: " + valueA);// 获取所有参数名Enumeration<String> initParameterNames = servletContext.getInitParameterNames();// 迭代并获取参数名及对应的值while (initParameterNames.hasMoreElements()) {String parameterName = initParameterNames.nextElement();System.out.println(parameterName + ":" + servletContext.getInitParameter(parameterName));}}
}
其他重要的API:
getRealPath(String path)
获取资源的磁盘路径
- 类/接口:
ServletContext
- 作用:
getRealPath()
方法将Web应用中的相对路径转换为服务器上文件系统的绝对路径。比如,如果相对路径是"upload"
,getRealPath("upload")
会返回服务器上upload
文件夹的绝对路径。这个方法适用于在服务器端处理文件的操作,比如上传或下载文件。 - 注意事项:如果应用程序部署为压缩文件(如
war
包),该方法可能返回null
,因为某些情况下资源未解压缩到文件系统中。String path = servletContext.getRealPath("upload"); System.out.println(path); // 输出服务器上upload目录的绝对路径
getContextPath()
- 类/接口:
ServletContext
- 作用:
getContextPath()
方法用于获取Web应用的上下文路径(context path)。上下文路径是Web应用的根路径,比如,如果Web应用的访问路径是http://localhost:8080/myapp
,那么getContextPath()
会返回"/myapp"
。
域对象
1. 域对象的定义
- 域对象是一些用于在特定范围内存储和传递数据的对象。不同的范围称为不同的“域”,每种域的范围不同,数据共享的范围也有所不同。
ServletContext
代表应用域,是Web应用中最大的域,可以在整个应用程序中实现数据的共享和传递。
2. 三大域对象
- 在Web应用中有三大域对象:
- 应用域 (
ServletContext
):范围为整个应用。 - 会话域 (
HttpSession
):范围为每个用户会话。 - 请求域 (
HttpServletRequest
):范围为每个请求。
- 应用域 (
- 这些域对象提供了一种机制,可以在不同的范围内共享数据。
3. 域对象的API
域对象都有类似的API,用来操作存储在域中的数据。常用的API有:
setAttribute(String key, Object value)
:向域中存储或修改数据,key
是数据的名称,value
是数据的值。getAttribute(String key)
:从域中获取数据,key
是数据的名称,返回的是数据的值。removeAttribute(String key)
:从域中移除数据,key
是数据的名称。
在 ServletContext
中使用
ServletContext
是应用级别的域对象,数据在整个Web应用程序生命周期内都有效,所有用户共享。
示例代码:
// 设置数据
ServletContext servletContext = this.getServletContext();
servletContext.setAttribute("globalData", "This is global data");// 获取数据
String globalData = (String) servletContext.getAttribute("globalData");
System.out.println("Global data: " + globalData);// 移除数据
servletContext.removeAttribute("globalData");
其实就相当于如果在Servlet1中传输数据给Servlet2就需要在ServletContext中设置数据(Servlet1使用设置数据的API),Servlet2获取数据即可。