ServletContext对象的创建过程
过程:
-
Servlet 容器启动时,会为每个 Web 应用(webapps 下的每个目录都是一个 Web 应用)创建一个唯一的 ServletContext 对象,该对象被称为“Servlet 上下文”
特点:
-
Web 应用中的所有 Servlet 共享同一个 ServletContext 对象
-
不同 Servlet 之间可以通过 ServletContext 对象实现数据通讯,因此 ServletContext 对象被称为 Context 域对象。
什么是域对象
概念:
域对象是服务器在内存上创建的存储空间,该空间用于不同动态资源(例如 Servlet、JSP)之间传递与共享数据。
ServletContext对象的生命周期
从 Servlet 容器启动时开始,到容器关闭或应用被卸载时结束。
获取ServletContext对象
//通过 GenericServlet的getServletContext方法获取ServletContext对象
ServletContext servletContext = this.getServletContext();//通过 ServletConfig的 getServletContext方法获取ServletContext对象
ServletContext servletContext = this.getServletConfig().getServletContext();//通过 HttpSession的 getServletContext方法获取ServletContext对象
ServletContext servletContext = req.getSession().getServletContext();//通过 HttpServletRequest的 getServletContext方法获取ServletContext对象
ServletContext servletContext = req.getServletContext();
ServletContext的应用创建
javax.servlet 包提供了一个 ServletContext 接口,该接口定义了一组方法,Servlet 可以使用这些方法与容器进行通信。
ServletContext的应用主要有:
-
获取上下文初始化参数
-
实现 Servlet 之间的数据通讯
-
读取 Web 应用下的资源文件
上下文初始化参数
使用 ServletContext 对象获取 Web 应用的上下文初始化参数步骤:
-
设置上下文初始化参数
-
调用接口中方法获取初始化参数
设置上下文初始化参数
本质:
-
在web.xml中使用
<context-param>
为Web应用设置一些全局初始化参数
特点:
-
应用中的所有 Servlet 都共享同一个上下文初始化参数。
-
在 Web 应用的整个生命周期中,上下文初始化参数会一直存在
-
可以随时被任意一个 Servlet 访问。
示例xml:
调用接口中方法获取初始化参数
获取步骤:
-
将
<context-param>
元素中的上下文初始化参数以键值对的形式存入ServletContent
对象中 -
通过 ServletContext 的相关方法获取到这些初始化参数。
方法:
返回值类型 | 方法 | 描述 |
---|---|---|
String | getInitParameter(String name) | 根据初始化参数名 name,返回对应的初始化参数值。 |
Enumeration<String> |
getInitParameterNames() | 返回 Web 应用所有上下文初始化参数名的枚举集合,如果该 Web 应用没有上下文初始化参数,则返回一个空的枚举集合。 |
示例代码:
流程:
-
初始化后每个Web容器有一个ServletConetnt对象
-
get方法和Enumeration方法获取参数内容
-
循环获取值
package ServletPractice;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
/**
* 使用ServletContext接口提供的方法获取到参数信息
* @since JDK 1.8
* @date 2021/09/15
* @author Lucifer
*/
数据通讯
实现原理:
-
ServletContext 接口的 setAttribute() 方法可以创建属性,属性被存放在 ServletContext 对象中。
-
所有 Servlet 都可以对这些属性进行访问和操作,通过属性可以实现应用内不同 Servlet 之间的数据通讯。
数据通讯的相关方法
返回值类型 | 方法 | 描述 |
---|---|---|
void | setAttribute(String name, Object object) | 把一个 Java 对象与一个属性名绑定,并将它作为一个属性存放到 ServletContext 中。 参数 name 为属性名,参数 object 为属性值。 |
void | removeAttribute(String name) | 从 ServletContext 中移除属性名为 name 的属性。 |
Object | getAttribute(String name) | 根据指定的属性名 name,返回 ServletContext 中对应的属性值。 |
示例代码:
需求:
-
在init方法中调用ServletContext下的方法设置context属性
-
在Get方法中获取属性的值
package ServletPractice;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 在init方法中调用ServletContext下的方法设置context属性
* 在Get方法中获取属性的值
* @since JDk 1.8
* @date 2021/09/15
* @author Lucifer
*/
展示详情类:
package ServletPractice;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 展示网站被访问详情的网页
* @since JDK 1.8
* @date 2021/09/15
* @author Lucifer
*/
读取Web应用下的资源文件
概念:
ServletContext 接口定义了一些读取 Web 资源的方法
返回值类型 | 方法 | 方法描述 |
---|---|---|
Set | getResourcePaths(String path) | 返回一个 Set 集合,该集合中包含资源目录中的子目录和文件的名称。 |
String | getRealPath(String path) | 返回资源文件的真实路径(文件的绝对路径)。 |
URL | getResource(String path) | 返回映射到资源文件的 URL 对象。 |
InputStream | getResourceAsStream(String path) | 返回映射到资源文件的 InputStream 输入流对象。 |
参数 path 代表资源文件的虚拟路径,它以正斜线/
开始,/
表示当前 Web 应用的根目录
示例:
在servletDemo的src目录下创建db.properties文件
name=编程帮
url=www.biancheng.net
desc=编程帮,欢迎你
读取代码:
package ServletPractice;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Properties;
/**
* 一个通过ServletContext接口读取配置文件的类
* @since JDk 1.8
* @date 2021/09/16
* @author Lucifer
*/
@WebServlet("/ReadServlet")
public class ReadServlet extends HttpServlet {
//设置UID
private static final long serialVersionUID = 1L;
//GET方法
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置相应字符集
response.setContentType("text/html;charset=UTF-8");
//打印内容到控制台
PrintWriter Writer = response.getWriter();
//获取相对路径中输入流的对象--->通过IO流读取配置文件
InputStream ins = getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
//获取输入流
Properties pro = new Properties();
//加载获取到的输入流内容
pro.load(ins);
//获取文件中相应的内容
String name = pro.getProperty("name");
String url = pro.getProperty("url");
String desc = pro.getProperty("desc");
}
//POST
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}