9.15JavaWeb之ServletContext接口

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 应用的上下文初始化参数步骤:

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

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

设置上下文初始化参数

本质:

  • 在web.xml中使用<context-param>为Web应用设置一些全局初始化参数

特点:

  • 应用中的所有 Servlet 都共享同一个上下文初始化参数。

  • 在 Web 应用的整个生命周期中,上下文初始化参数会一直存在

  • 可以随时被任意一个 Servlet 访问。

示例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> 元素中的上下文初始化参数以键值对的形式存入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
*/
@WebServlet("ReadContextServlet")
public class MyServletDemoNo11 extends HttpServlet {
   private static final long serialVersionUID = 1L;

   @Override
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //打印内容到输出台
       response.setContentType("text/html;charset=UTF-8");
       PrintWriter writer = response.getWriter();
       writer.write("HelloNo11");
       //调用httpServlet父类GenericServlet的getServletContext方法获取ServletContext对象
       ServletContext context = super.getServletContext();
       //返回 context 上下文初始化参数的名称
       Enumeration<String> initParameterNames = context.getInitParameterNames();
       while (initParameterNames.hasMoreElements()) {
           // 获取初始化参数名称
           String initParamName = initParameterNames.nextElement();
           // 获取相应的初始参数的值
           String initParamValue = context.getInitParameter(initParamName);
           // 向页面输出
           writer.write(initParamName + " : " + initParamValue + "<br/>");
      }
       // 关闭流
       writer.close();
  }

   @Override
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doGet(request, response);
  }
}

数据通讯

实现原理:

  • 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
*/
@WebServlet("/CountServlet")
public class MyServletDemoNo12 extends HttpServlet {
   //设置属性
   private static final long serialVersionUID = 1L;

   //初始化
   @Override
   public void init() throws ServletException {
       //获取Web应用对象
       ServletContext context = getServletContext();
       //调用方法为Web应用设置属性
       context.setAttribute("count", 0);
  }

   //Get
   @Override
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       // 调用httpServlet父类GenericServlet的getServletContext方法获取ServletContext对象
       ServletContext context = super.getServletContext();
       // 获取count的值,自增
       Integer count = (Integer) context.getAttribute("count");
       // 存入到域对象中
       context.setAttribute("count", ++count);
       // 向页面输出内容
       response.setContentType("text/html;charset=UTF-8");
       response.getWriter().write("<h3>编程帮 www.biancheng.net 欢迎您</h3>");
  }

   //Post
   @Override
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doGet(request, response);
  }
}

展示详情类:

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
*/
@WebServlet()
public class ShowServlet extends HttpServlet {
   private static final long serialVersionUID = 1L;
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       // 获取ServletContext中存放的count属性(即页面的访问次数)
       Integer count = (Integer) getServletContext().getAttribute("count");
       // 向页面输出
       response.setContentType("text/html;charset=UTF-8");
       // 若CountServlet已被访问
       if (count != null) {
           response.getWriter().write("<h3>该网站一共被访问了" + count + "次</h3>");
      } else {
           // 若CountServlet未被访问,提示先访问CountServlet
           response.getWriter().write("<h3>请先访问 CountServlet</h3>");
      }
  }
   protected void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
       doGet(request, response);
  }
}

读取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);
}
}
It's a lonely road!!!
原文地址:https://www.cnblogs.com/JunkingBoy/p/15308439.html