谈谈 ServletConfig 和 ServletContext

目录
    • 一、ServletConfig 和 ServletContext 的概念
      • 含义
      • 创建时期
      • 作用范围
    • 二、ServletConfig 和 SerlvetContext 代码表示
      • 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文件中,例如




    
    
        BasicSerlvet
        com.app.servlet.BasicServletConfig
        
            name1
            value1
        
        
            name2
            value2
        
    
    
        BasicSerlvet
        /basic
    
    

通过访问/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 的内容 --
          // 获取 属性
          String servletName = servletConfig.getServletName();
          System.out.println("当前Servlet 在web.xml中配置的名称:"+ servletName);

  //        String name = servletConfig.getInitParameter("name1");
  //        System.out.println("name = " + name);

          // 获取初始化参数,也就是
          // 通过servletConfig.getInitParameterNames() 获取
          Enumeration 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 getInitParameterNames();
    }

ServletContext 用于XML 配置文件中

	
        encode
        utf-8
	

其实也就表示的是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中定义的属性 
          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 的地址

    
        BasicContext
        /context
  

运行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的地址,完整的配置如下


    
  

      
      
          BasicSerlvet
          com.app.servlet.BasicServletConfig
          
              name1
              value1
          
          
              name2
              value2
          
      
      
          BasicSerlvet
          /basic
      

      
      
          BasicContext
          com.app.servlet.BasicServletContext
      

      
          BasicContext
          /context
      

      
      
          BasicContext2
          com.app.servlet.BasicServletContext2
      

      
          BasicContext2
          /context2
      

      
          encode
          utf-8
      

  

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

name = value1

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

参考:

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

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

你可能感兴趣的:(谈谈 ServletConfig 和 ServletContext)