zoukankan      html  css  js  c++  java
  • 谈谈 ServletConfig 和 ServletContext

    一、ServletConfig 和 ServletContext 的概念

    ​ 我们都知道Servlet是框架的灵魂,学习web框架最底层离不开Servlet的支持,那么Servlet 是什么呢?如何创建一个Servlet 不是本文的重点,相关文章可以参考

    谈谈你对Servlet 的理解: https://blog.csdn.net/qq_39688352/article/details/76794973

    含义

    ServletConfig : Servlet的配置对象,容器在初始化的时候通过它传递信息给Servlet

    ServletContext : 上下文对象,提供了一系列方法提供Servlet 与 Web容器交互

    创建时期

    ServletConfig : 在容器初始化Servlet的时候,并为其提供上下文初始化参数的名/值对的引用。

    ServletContext : 容器启动的时候,并为其提供Servlet初始化参数的名/值对的引用。

    作用范围

    ServletContext : 每个JVM中每个Web应用一个ServletContext。

    ServletConfig : 每个JVM中每个Web应用的每个Servlet一个ServletConfig。

    二、ServletConfig 和 SerlvetContext 代码表示

    ServletConfig

    ​ ServletConfig 位于javax.servlet包内, ServletConfig 是一个接口,servlet容器用于在初始化期间将信息传递给servlet的servlet配置对象。

    ServletConfig : 用于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">
    
        <!-- 第一个Servlet ServletConfig -->
        <servlet>
            <servlet-name>BasicSerlvet</servlet-name>
            <servlet-class>com.app.servlet.BasicServletConfig</servlet-class>
            <init-param>
                <param-name>name1</param-name>
                <param-value>value1</param-value>
            </init-param>
            <init-param>
                <param-name>name2</param-name>
                <param-value>value2</param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>BasicSerlvet</servlet-name>
            <url-pattern>/basic</url-pattern>
        </servlet-mapping>
        
    </web-app>
    

    通过访问/basic 这个url,然后拿到servlet-name ,用这个servlet-name 与上面的servlet-name 配置进行匹配,匹配得到servlet-class 的全路径名称即是这个Servlet的地址

    使用Java代码如何获取上面的配置信息?先从基本的示例入手,搭建一个Servlet,配置tomcat 并启动起来

    Idea 搭建配置Servlet

    https://blog.csdn.net/yhao2014/article/details/45740111

        public class BasicServletConfig extends HttpServlet {
    
    
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
              // 通过getServletConfig 得到 ServletConfig 对象,
              // 这个getServletConfig 是 GenericServlet中的方法
              // 通过查看HttpServlet 可知,HttpServlet 继承于GenericServlet
              // GenericServlet 实现了Servlet 接口,同时也实现了ServletConfig 接口
              ServletConfig servletConfig = getServletConfig();
    
              // -- 获取当前Servlet 中的web.xml 的内容 --
              // 获取<servlet-name> 属性
              String servletName = servletConfig.getServletName();
              System.out.println("当前Servlet 在web.xml中配置的名称:"+ servletName);
    
      //        String name = servletConfig.getInitParameter("name1");
      //        System.out.println("name = " + name);
    
              // 获取初始化参数,也就是<init-param>
              // 通过servletConfig.getInitParameterNames() 获取<param-name>
              Enumeration<String> enumration = servletConfig.getInitParameterNames();
              while (enumration.hasMoreElements()){
                  String element = enumration.nextElement();
                  String name = servletConfig.getInitParameter(element);
                  System.out.println("name = " + name);
              }
    
              ServletContext context = servletConfig.getServletContext();
              System.out.println("context = " + context);
    
          }
    
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
             doGet(req,resp);
          }
      }
    

    也就是说,ServletConfig 其实就是一系列的Serlvet 配置。通过GenericServlet 中的getServletConfig() 能够获取到web.xml中的配置文件。

    启动应用程序,访问 http://localhost:8080/basic ,可以看到控制台输出

    当前Servlet 在web.xml中配置的名称:BasicSerlvet
    name = value2
    name = value1
    context = org.apache.catalina.core.ApplicationContextFacade@270c1d43

    ServletContext

    ​ 描述完ServletConfig ,下面就来聊一聊ServletContext,一看后面的Context 就知道这应该是一个Servlet 的上下文环境,其实就是这样。

    ServletContext 位于 javax.servlet 包内,是一个接口 ,定义servlet用于与其servlet容器通信的一组方法,例如,获取文件的MIME类型,分派请求或写入日志文件。servletContext对象包含在ServletConfig对象中,Web服务器在初始化servlet时提供servlet。

        public interface ServletConfig {
            String getServletName();
     				// 获取ServletContext 上下文环境
            ServletContext getServletContext();
    
            String getInitParameter(String var1);
    
            Enumeration<String> getInitParameterNames();
        }
    

    ServletContext 用于XML 配置文件中

    	<context-param>
            <param-name>encode</param-name>
            <param-value>utf-8</param-value>
    	</context-param>
    

    其实也就表示的是ServletContext 的上下文环境

    Java 代码表示:

    首先建立一个BasicServletContext 类

        public class BasicServletContext extends HttpServlet {
    
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
              // 通过getServletContext 获取ServletContext 的上下文环境对象
              // getServletContext() 其实是ServletConfig 中的方法
              ServletContext servletContext = getServletContext();
              // ServletContext 的作用范围是整个Web应用,也就是说,你在这个Servlet中设置的值
              // 在其他Servlet中也能够获取到。
              servletContext.setAttribute("name1","value1");
    
            	// 获取web.xml中定义的属性 <param-name>
              String encode = (String)servletContext.getInitParameter("encode");
              System.out.println("encode = " + encode);
          }
    
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req,resp);
          }
      }
    

    web.xml 添加一个BasicServletContext 的地址

        <servlet-mapping>
            <servlet-name>BasicContext</servlet-name>
            <url-pattern>/context</url-pattern>
      </servlet-mapping>
    

    运行tomcat,访问 http://localhost:8080/context ,可以看到控制台输出

    encode = utf-8

    再建立一个 BasicServletContext2 ,用于获取BasicServletContext 中设置的值

        public class BasicServletContext2 extends HttpServlet {
    
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              ServletContext servletContext = getServletContext();
              // 接收由BasicServletContext 设置的 attribute 参数
              String name = (String) servletContext.getAttribute("name1");
              System.out.println("name = " + name);
    
          }
    
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req,resp);
          }
      }
    

    web.xml添加一个对BasicServletContext2的地址,完整的配置如下

    
        <?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">
    
          <!-- 第一个Servlet ServletConfig -->
          <servlet>
              <servlet-name>BasicSerlvet</servlet-name>
              <servlet-class>com.app.servlet.BasicServletConfig</servlet-class>
              <init-param>
                  <param-name>name1</param-name>
                  <param-value>value1</param-value>
              </init-param>
              <init-param>
                  <param-name>name2</param-name>
                  <param-value>value2</param-value>
              </init-param>
          </servlet>
          <servlet-mapping>
              <servlet-name>BasicSerlvet</servlet-name>
              <url-pattern>/basic</url-pattern>
          </servlet-mapping>
    
          <!-- 第二个Servlet ServletConfig -->
          <servlet>
              <servlet-name>BasicContext</servlet-name>
              <servlet-class>com.app.servlet.BasicServletContext</servlet-class>
          </servlet>
    
          <servlet-mapping>
              <servlet-name>BasicContext</servlet-name>
              <url-pattern>/context</url-pattern>
          </servlet-mapping>
    
          <!-- 第三个Servlet ServletConfig-->
          <servlet>
              <servlet-name>BasicContext2</servlet-name>
              <servlet-class>com.app.servlet.BasicServletContext2</servlet-class>
          </servlet>
    
          <servlet-mapping>
              <servlet-name>BasicContext2</servlet-name>
              <url-pattern>/context2</url-pattern>
          </servlet-mapping>
    
          <context-param>
              <param-name>encode</param-name>
              <param-value>utf-8</param-value>
          </context-param>
    
      </web-app>
    

    运行tomcat, 访问http://localhost:8080/context2 ,发现控制台输出

    name = value1

    也就是说,BasicServletContext2 获取到了 BasicServletContext 设置的attribute 的值

    参考:

    http://www.importnew.com/21506.html

    https://jokerlinisty.iteye.com/blog/2194190

  • 相关阅读:
    洛谷-P5357-【模板】AC自动机(二次加强版)
    洛谷-P3796-【模板】AC自动机(加强版)
    洛谷-P3808-【模板】AC自动机(简单版)
    2020 CCPC Wannafly Winter Camp Day2-K-破忒头的匿名信
    zabbix的搭建
    playbook 介绍
    ansible 模块
    shell 脚本判断ip
    shell 脚本安装lnmp
    expect 介绍
  • 原文地址:https://www.cnblogs.com/cxuanBlog/p/10927813.html
Copyright © 2011-2022 走看看