9.15JavaWeb之ServletContext接口
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);
}
}
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号