谈谈 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
谈谈 ServletConfig 和 ServletContext的更多相关文章
- ServletConfig与ServletContext
ServletConfig与ServletContext对象详解 一.ServletConfig对象 在Servlet的配置文件中,可以使用一个或多个<init-param>标签为s ...
- ServletConfig和ServletContext
ServletConfig和ServletContext Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为Servle ...
- JavaEE:Servlet简介及ServletConfig、ServletContext
Servlet简介 1.Servlet是sun公司提供的一门用于开发动态web资源的技术*静态web资源:固定数据文件*动态web资源:通过程序动态生成数据文件2.Servlet技术基于Request ...
- day05 Servlet 开发和 ServletConfig 与 ServletContext 对象
day05 Servlet 开发和 ServletConfig 与 ServletContext 对象 1. Servlet 开发入门 - hello world 2. Servlet 的调用过程和生 ...
- JaveWeb学习之Servlet(二):ServletConfig和ServletContext
原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2018-07-26/20.html 作者:夜月归途 出处:http://www.guitu ...
- ServletConfig、ServletContext 的应用
一.ServletConfig对象及其应用(用的不多) 1. Context和ContextPath:一个web工程,若名为JavaWeb,访问的路径为:http://localhost:8080/J ...
- JavaWeb学习笔记:ServletConfig()和ServletContext()
ServletConfig()和ServletContext() 1.ServletConfig() ServletConfig是一个接口,它由server提供商来实现. ServletConfig封 ...
- ServletConfig和ServletContext 区别
ServletConfig和ServletContext 1.ServletContext在整个web应用程序生命周期内存在,用来保存全局对象,整个web应用都可以使用其获取context参数.当 ...
- Servlet技术之——概述、实现、细节、获取资源、ServletConfig、ServletContext
Servlet概述.实现.细节.获取资源.ServletConfig.ServletContext (一) Setvlet基本概述 (1) 什么是Servlet ? Servlet(Server Ap ...
随机推荐
- python基础-面向对象的三大特征
继承 单继承 父类 基类 子类 派生类 继承:是面向对象软件技术当中的一个概念,如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”. ...
- Python中re(正则表达式)模块使用方法
Python中常用的正则表达式处理函数: re.match re.match 尝试从字符串的开始匹配一个模式,如:下面的例子匹配第一个单词. import re text = "JGood ...
- 【HIHOCODER 1055】 刷油漆(树上背包)
描述 小Ho有着一棵灰常好玩的树玩具!这棵树玩具是由N个小球和N-1根木棍拼凑而成,这N个小球都被小Ho标上了不同的数字,并且这些数字都是处于1..N的范围之内,每根木棍都连接着两个不同的小球,并且保 ...
- Spring MVC+Mybatis 多数据源配置及发现的几个问题
1.CustomerContextHolder 数据源管理类,负责管理当前的多个数据源,基于ThreadLocal实现,对每个线程设置不同的目标数据源 public class CustomerCon ...
- HDU 5236 Article 期望
题意: 你现在要打\(n\)个字符,但是程序随时可能会崩溃. 你可以在恰当的时机按下 \(Ctrl-S\)键,崩溃后,会从最后一次保存的情况继续开始打字. 具体是这样的: 在每个第\(i-0.1s(i ...
- 【NOIP2016】愤怒的小鸟 搜索
题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 (0,0)(0,0) 处,每次 Kiana 可以用它向第一象限发射一只红色的小鸟,小 ...
- 缓存淘汰算法之LRU实现
Java中最简单的LRU算法实现,就是利用 LinkedHashMap,覆写其中的removeEldestEntry(Map.Entry)方法即可 如果你去看LinkedHashMap的源码可知,LR ...
- javascript学习笔记 - 引用类型 Object
引用类型是一种数据结构,也称作对象定义,类似于类的概念. 对象是引用类型的实例. javascript引用类型有:Object, Array, Date, RegExp, Function 使用new ...
- Timer和TimerTask详解
1.概览 Timer是一种定时器工具,用来在一个后台线程计划执行指定任务.它可以计划执行一个任务一次或反复多次.TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务. 简单的一个例 ...
- 第001弹:Java 中创建对象的4种方式
Java 是面向对象的语言,不可避免的,“对象”这个概念是 Java 语言的核心部分,这里来简单讨论一下在 Java 中创建一般对象的方法. 总结下来有以下4种创建对象的方法: 使用 new 关键字调 ...