Servlet 容器启动时,会为每个 Web 应用(webapps 下的每个目录都是一个 Web 应用)创建一个唯一的 ServletContext 对象,该对象一般被称为“Servlet 上下文”。

ServletContext 对象的生命周期从 Servlet 容器启动时开始,到容器关闭或应用被卸载时结束。

Web 应用中的所有 Servlet 共享同一个 ServletContext 对象,不同 Servlet 之间可以通过 ServletContext 对象实现数据通讯,因此 ServletContext 对象也被称为 Context 域对象。

域对象是服务器在内存上创建的存储空间,该空间用于不同动态资源(例如 Servlet、JSP)之间传递与共享数据。

获得 ServletContext 对象

获得 ServletContext 对象有以下 4 种方式:

1. 通过 GenericServlet 提供的 getServletContext() 方法

  1. //通过 GenericServlet的getServletContext方法获取ServletContext对象
  2. ServletContext servletContext = this.getServletContext();

2. 通过 ServletConfig 提供的 getServletContext() 方法

  1. //通过 ServletConfig的 getServletContext方法获取ServletContext对象
  2. ServletContext servletContext = this.getServletConfig().getServletContext();

3. 通过 HttpSession 提供的 getServletContext() 方法

  1. //通过 HttpSession的 getServletContext方法获取ServletContext对象
  2. ServletContext servletContext = req.getSession().getServletContext();

4. 通过 HttpServletRequest 提供的 getServletContext() 方法

  1. //通过 HttpServletRequest的 getServletContext方法获取ServletContext对象
  2. ServletContext servletContext = req.getServletContext();

注意:以上最后两种方法了解即可,后面我们会详细讲解。

ServletContext 的应用

javax.servlet 包提供了一个 ServletContext 接口,该接口定义了一组方法,Servlet 可以使用这些方法与容器进行通信。

ServletContext 的应用主要有以下 3 个:

  1. 获取上下文初始化参数
  2. 实现 Servlet 之间的数据通讯
  3. 读取 Web 应用下的资源文件

1. 获取上下文初始化参数

使用 ServletContext 对象获取 Web 应用的上下文初始化参数,分为 2 步:
1) 设置上下文初始化参数
2) 调用接口中方法获取初始化参数

1) 设置上下文初始化参数

通过 web.xml 中的 <context-param> 元素可以为 Web 应用设置一些全局的初始化参数,这些参数被称为上下文初始化参数。

与 Servlet 的初始化参数不同,应用中的所有 Servlet 都共享同一个上下文初始化参数。在 Web 应用的整个生命周期中,上下文初始化参数会一直存在,并且可以随时被任意一个 Servlet 访问。

在 web.xml 文件中配置上下文初始化参数,代码如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0" metadata-complete="false">
<!--设置全局初始化参数 -->
<context-param>
<param-name>name</param-name>
<param-value>编程帮</param-value>
</context-param>
<context-param>
<param-name>url</param-name>
<param-value>www.biancheng.net</param-value>
</context-param>
</web-app>

对以上标签说明如下:

  • <context-param> 元素用来声明上下文初始化参数,必须在根元素 <web-app> 内使用。
  • <param-name> 子元素表示参数名,参数名在整个 Web 应用中必须是唯一的。
  • <param-value> 子元素表示参数值。

2) 调用接口中方法获取初始化参数

Servlet 容器启动时,会为容器内每个 Web 应用创建一个 ServletContext 对象,并将 <context-param> 元素中的上下文初始化参数以键值对的形式存入该对象中,因此我们可以通过 ServletContext 的相关方法获取到这些初始化参数。

下表列举了 ServletContext 接口中用于获取上下文初始化参数的相关方法。

返回值类型 方法 描述
String getInitParameter(String name) 根据初始化参数名 name,返回对应的初始化参数值。
Enumeration<String> getInitParameterNames() 返回 Web 应用所有上下文初始化参数名的枚举集合,如果该 Web 应用没有上下文初始化参数,则返回一个空的枚举集合。

2. 实现数据通讯

在 Servlet 中,调用 ServletContext 接口的 setAttribute() 方法可以创建一些属性,这些属性被存放在 ServletContext 对象中。应用中所有 Servlet 都可以对这些属性进行访问和操作,通过它们可以实现应用内不同 Servlet 之间的数据通讯。

数据通讯的相关方法

下表列举了 ServletContext 接口实现数据通讯的相关方法。

返回值类型 方法 描述
void setAttribute(String name, Object object) 把一个 Java 对象与一个属性名绑定,并将它作为一个属性存放到 ServletContext 中。
参数 name 为属性名,参数 object 为属性值。
void removeAttribute(String name) 从 ServletContext 中移除属性名为 name 的属性。
Object getAttribute(String name) 根据指定的属性名 name,返回 ServletContext 中对应的属性值。

ServletContext 属性与上下文初始化参数对比

虽然 ServletContext 的属性与上下文初始化参数都是存放在 ServletContext 对象中,但它们是不同的。

不同点 ServletContext 的属性 上下文初始化参数
创建方式 ServletContext 的属性通过调用 ServletContext 接口的 setAttribute() 方法创建 上下文初始化参数通过 web.xml 使用 <context-param> 元素配置
可进行的操作 ServletContext 的属性可以通过 ServletContext 接口的方法进行读取、新增、修改、移除等操作 上下文初始化参数在容器启动后只能被读取,不能进行新增、修改和移除操作
生命周期 ServletContext 中属性的生命周期从创建开始,到该属性被移除(remove)或者容器关闭结束 上下文初始化参数的生命周期,从容器启动开始,到 Web 应用被卸载或容器关闭结束
作用 使用 ServletContext 中的属性可以实现 Servlet 之间的数据通讯 使用上下文初始化参数无法实现数据通讯

3. 读取 Web 应用下的资源文件

在实际开发中,有时会需要读取 Web 应用中的一些资源文件,如配置文件和日志文件等。为此,ServletContext 接口定义了一些读取 Web 资源的方法 ,如下表。

返回值类型 方法 方法描述
Set getResourcePaths(String path) 返回一个 Set 集合,该集合中包含资源目录中的子目录和文件的名称。
String  getRealPath(String path)  返回资源文件的真实路径(文件的绝对路径)。
URL  getResource(String path) 返回映射到资源文件的 URL 对象。
InputStream getResourceAsStream(String path) 返回映射到资源文件的 InputStream 输入流对象。

注:上表中参数 path 代表资源文件的虚拟路径,它以正斜线/开始,/表示当前 Web 应用的根目录。

ServletContext接口的更多相关文章

  1. Servlet笔记4--ServletConfig接口和ServletContext接口

    ServletConfig接口: ServletContext接口: 代码详解: (1)web.xml配置文件: <?xml version="1.0" encoding=& ...

  2. java学习笔记—ServletConfig、ServletContext接口(13)

    ServletConfig是一个由Tomcat服务器在初始化Servlet的时候创建并传递进来的一个对象. 该对象主要描述的时候一个servlet的配置信息. 如: <servlet>  ...

  3. ServletContext接口(六)

    javax.servlet.ServletContext接口 ServletContext(上下文)是公用的,就是.net中的application,主要用到的就是全局set设置值,get获取值,ja ...

  4. Java EE javax.servlet中的ServletContext接口

    ServletContext接口 public interface ServletContext (https://docs.oracle.com/javaee/7/api/javax/servlet ...

  5. ServletConfig和ServletContext接口

    ServletConfig 在web.xml文件中使用一个或多个init-param元素进行配置后,Tomcat初始化Servlet时,都会将该Servlet的配置信息封装到一个ServletConf ...

  6. ServletContext 接口读取配置文件要注意的路径问题

    在建立一个maven项目时,我们通常把一些文件直接放在resource下面,在ServletContext中有getResource(String path)和getResourceAsStream( ...

  7. [原创]java WEB学习笔记06:ServletContext接口

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. servlet的ServletContext接口

    ServletContext Servlet 上下文 每个web工程都只有一个ServletContext对象,也就是不管在哪个servlet里面,获取到的这个ServletContext对象都是同一 ...

  9. ServletContext与ServletConfig的详解及区别

    转自http://hi.baidu.com/huaxuelili/item/1704a03dbb5cd7f22784f4c6 一.ServletContext详解ServletContext是serv ...

随机推荐

  1. 音视频中的PTS和DTS及同步

    视频的播放过程可以简单理解为一帧一帧的画面按照时间顺序呈现出来的过程,就像在一个本子的每一页画上画,然后快速翻动的感觉.       但是在实际应用中,并不是每一帧都是完整的画面,因为如果每一帧画面都 ...

  2. BitBake使用攻略--BitBake的语法知识一

    目录 写在前面 1. BitBake中的赋值 1.1 直接赋值 1.2 间接赋值 1.3 追加与前加赋值 1.4 Override风格的赋值语法 1.5 标志赋值 1.6 内联函数赋值 1.7 其他一 ...

  3. 【LeetCode】280. Wiggle Sort 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序后交换相邻元素 日期 题目地址:https://l ...

  4. 【LeetCode】940. Distinct Subsequences II 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetc ...

  5. The Balance(poj2142)

    The Balance Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5452   Accepted: 2380 Descr ...

  6. MacOS使用Docker创建MySQL主从数据库

    一.拉取MySQL镜像 通过终端获取最新的MySQL镜像 docker pull mysql/mysql-server 二.创建MySQL数据库容器配置文件对应目录 我们在当前用户下创建一组目录,用来 ...

  7. Java生成随机数的4种方式

    Random Random 类诞生于 JDK 1.0,它产生的随机数是伪随机数,也就是有规则的随机数.Random 使用的随机算法为 linear congruential pseudorandom ...

  8. Java 字符与字符串

    字符 // 定义字符 char c1 = 'a'; char c2 = '1'; char c3 = '中'; // 自动装箱 Character c = c1; // 自动拆箱 c1 = c; // ...

  9. CSS基础 BFC的使用方法

    BFC的作用和创建1.html标签是BFC盒子2.浮动元素是BFC盒子3.行内块元素是BFC盒子4.overflow属性值不为visible,如:auto.hidden...作用:1.清除浮动: 2. ...

  10. 初识python: 类练习 - 随机数生成

    1.提取指定值之间的指定个数的随机整数. 2.继承生成随机数的类,打印"坐标". 生成随机数类: import random class GetRadndom(object): ' ...