• 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!!!
  • 相关阅读:
    Hive学习之路 (十二)Hive SQL练习之影评案例
    Hive学习之路 (十一)Hive的5个面试题
    Guava Files 源码分析(二)
    Guava Files 源码分析(一)
    观察者模式与Guava EventBus
    Guava 源码分析之 Beta, GwtCompatible, GwtIncompatible, Charset, HashCode
    Java IO的简单示例
    从volatile说到i++的线程安全问题
    乐观锁与悲观锁
    SimpleDateFormat的线程安全问题与解决方案
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15308439.html
Copyright © 2020-2023  润新知