谈谈 ServletConfig 和 ServletContext

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

一、ServletConfig 和 ServletContext 的概念含义创建时期作用范围二、ServletConfig 和 SerlvetContext 代码表示ServletConfigServletContext

一、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 的值

关于ServletContext 中的方法还有很多,这里就不再详细介绍了,有兴趣的读者可以自行搜索。


相关文章
|
Linux 数据安全/隐私保护 Windows
Linux vsFTPd服务详解——本地用户登录实战
Linux vsFTPd服务详解——本地用户登录实战
394 2
|
8月前
|
人工智能 分布式计算 监控
AgentSociety:告别纸上谈兵!AI社会模拟器预判政策漏洞:输入新规秒看30年后社会形态
AgentSociety 是清华大学推出的基于大语言模型的社会模拟器,通过构建类人心智的智能体模拟复杂社会行为,适用于政策沙盒测试、危机预警等场景。
356 6
|
安全 Android开发 iOS开发
安卓与iOS移动操作系统的发展与比较
在移动互联网时代的今天,安卓和iOS作为两大主流移动操作系统,各自以其独特的特性和生态系统深刻影响着全球用户。本文将探讨它们的发展历程、核心特点以及在用户体验、开发生态和安全性方面的比较。
451 1
|
搜索推荐 程序员
探索代码之美:一段编程旅程的启发与感悟
【8月更文挑战第30天】编程,这个听起来有些高冷的技能,实际上就像绘画或音乐一样,是一种创造性的表达。它不仅仅是冷冰冰的代码和逻辑,更是情感和智慧的结晶。本文将通过一次个人的编程经历,探讨如何通过代码来解决问题、创造美,以及这一过程中的思考与成长,从而揭示编程背后的艺术性和哲学意义。
|
存储 虚拟化
【服务器数据恢复】戴尔DELL EMC SC系列存储服务器故障StorageCenter停机错误数据恢复案例
客户报告其戴尔DELL SCv/EMC SC E10J (4020) 存储服务器故障,登录后提示Storage Center停机且数据不可访问。此故障可能源于系统问题或硬盘故障。解决方案包括:若为系统问题,可联系戴尔售后重装系统以恢复数据访问;若涉及硬盘损坏,则需物理镜像硬盘或将所有硬盘取出并手动解析虚拟化信息以重组阵列结构。此类故障常见于保修期后的服务器,需定期维护预防。
174 1
|
Linux
LINUX打印机报错:ipp error(1034, client-error-document-format-not-supported)
LINUX打印机报错:ipp error(1034, client-error-document-format-not-supported)
4498 0
LINUX打印机报错:ipp error(1034, client-error-document-format-not-supported)
|
安全 Java 编译器
Kotlin 1.6 正式发布,带来哪些新特性?
Kotlin 1.6 正式发布,带来哪些新特性?
117 0
|
人工智能 自然语言处理 区块链
【Unity 3D】元宇宙概念、应用前景、价值链等概述
【Unity 3D】元宇宙概念、应用前景、价值链等概述
252 0
|
Oracle 关系型数据库 MySQL
一款针对EF Core轻量级分表分库、读写分离的开源项目
一款针对EF Core轻量级分表分库、读写分离的开源项目
200 0
|
存储 安全 Java
ThreadLocal介绍和应用
ThreadLocal介绍和应用
189 0