談談 ServletConfig 和 ServletContext

1、ServletConfig 和 ServletContext 的概念

​ 咱們都知道Servlet是框架的靈魂,學習web框架最底層離不開Servlet的支持,那麼Servlet 是什麼呢?如何建立一個Servlet 不是本文的重點,相關文章能夠參考java

談談你對Servlet 的理解: https://blog.csdn.net/qq_39688352/article/details/76794973web

含義

ServletConfig : Servlet的配置對象,容器在初始化的時候經過它傳遞信息給Servletapache

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

建立時期

ServletConfig : 在容器初始化Servlet的時候,併爲其提供上下文初始化參數的名/值對的引用。服務器

ServletContext : 容器啓動的時候,併爲其提供Servlet初始化參數的名/值對的引用。app

做用範圍

ServletContext : 每一個JVM中每一個Web應用一個ServletContext。框架

ServletConfig : 每一個JVM中每一個Web應用的每一個Servlet一個ServletConfig。ide

2、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

相關文章
相關標籤/搜索