tomcat加载web.xml
这几天看tomcat的源码,疑问很多,比如之一“ tomcat 怎么加载 web.xml”,下面是跟踪的过程,其中事件监听器有一个观察者模式,比较好。记录下来以供参考
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>tomcat load web.xml>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
tomcat加载web.xml中用户的servlet到context中去,同时实例化该servlet到/WEB-INF/classes/中
过程大致如下
由事件接收器 接收 到CONFIGURE_START_EVENT的消息后,才会触发处理加载web.xml的动作,
/**
* The LifecycleEvent type for the "configure_start" event. Used by those
* components that use a separate component to perform configuration and
* need to signal when configuration should be performed - usually after
* {@link #BEFORE_START_EVENT} and before {@link #START_EVENT}.
*/
public static final String CONFIGURE_START_EVENT = "configure_start";
那么又是谁来把该消息注册到监听器中的呢?如下,从启动过程中进行查找:
org.apache.catalina.startup.Bootstrap.start()
-->org.apache.catalina.startup.Catalina.start()
----》load()
------》
getServer().init();
Server==="org.apache.catalina.core.StandardServer"
-----》StandardServer.initInternal()
StandardServer.startInternal()
---》
void java.org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(String type, Object data)
fireLifecycleEvent(CONFIGURE_START_EVENT, null);
---》
LifecycleSupport fireLifecycleEvent(CONFIGURE_START_EVENT, null);
由LifecycleSupport 来广播给所有的接收者,
接收者根据需要来判断是否需要处理【此处用到观察者模式 】
而public class ContextConfig implements LifecycleListener
是所谓的接收者
其重写的 lifecycleEvent(LifecycleEvent event)方法中
if (event.getType().equals(Lifecycle.CONFIGURE_START_EVENT)) {
configureStart();该方法是进行加载的具体方法
protected synchronized void configureStart()
-----------------》webconfig()
:::::
webconfig()中
{
String resource =
"/WEB-INF/classes/" + binding.getName();
try {
URL url = sContext.getResource(resource);
processAnnotationsUrl(url, webXml,
webXml.isMetadataComplete());
} catch (MalformedURLException e) {
log.error(sm.getString(
"contextConfig.webinfClassesUrl",
resource), e);
}
}
---------------》
void java.org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(URL url, WebXml fragment, boolean handlesTypesOnly)
----------》
void java.org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(URL url, WebXml fragment, boolean handlesTypesOnly)
------------》
void java.org.apache.catalina.startup.ContextConfig.processAnnotationsStream(InputStream is, WebXml fragment, boolean handlesTypesOnly) throws ClassFormatException, IOException
--------------》
void java.org.apache.catalina.startup.ContextConfig.processAnnotationWebServlet(String className, AnnotationEntry ae, WebXml fragment)
---------》
fragment.addServlet(servletDef);
fragment.addServletMapping(urlPattern, servletName);
------->webXml.configureContext(context);
public void configureContext(Context context) {
Wrapper wrapper = context.createWrapper();
context.addChild(wrapper);
context.addServletMapping(entry.getKey(), entry.getValue());
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>tomcat load web.xml>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
tomcat加载web.xml的更多相关文章
- tomcat加载web项目报错:bad major version at offset=6
分析原因是开发的web项目的java版本高于tomcat使用的java版本,比如我是在java1.6上开发的,但是tomcat使用的java运行环境是1.5,所以会报改错误. 转载博客如下:http: ...
- web.xml的contextConfigLocation作用及自动加载applicationContext.xml
web.xml的contextConfigLocation作用及自动加载applicationContext.xml 转自:http://blog.csdn.net/sapphire_aling/ar ...
- spring boot 加载web容器tomcat流程源码分析
spring boot 加载web容器tomcat流程源码分析 我本地的springboot版本是2.5.1,后面的分析都是基于这个版本 <parent> <groupId>o ...
- 在eclipse中启动tomcat加载不了项目的解决方法
一.在server视图右键选择Add and Remove时,如果想要部署的项目不在左侧的待选列表中,或是弹出警告There are no resources that can be added or ...
- tomcat下的web.xml和项目中的web.xml
Tomcat 服务器中存在一个web.xml文件 在项目文件夹中同样存在一个web.xml文件 那这两个文件有什么区别呢? tomcat中的web.xml是通用的,如果不设置,那么就会默认是同tomc ...
- Tomcat中的Web.xml和servlet.xml的学习
Web.xml文件使用总结 作用: 存储项目相关的配置信息,保护servlet.解耦一些数据对程序的依赖 使用位置: 每个web项目中 Tomcat服务器中(在服务器目录conf目录中) 区别: We ...
- 一劳永逸部署项目:通过tomcat加载环境变量
一劳永逸部署项目:通过tomcat加载环境变量 转载自:https://blog.csdn.net/u010414666/article/details/46499953 一.说明 项目中经常会用到x ...
- 修改类不用重启Tomcat加载整个项目
可以修改类不用重启Tomcat加载整个项目(手工启动) 配置reloadable=true(自动重载) 使用Debug模式,前提是仅限于局部修改.(修改类不用重启--热加载) Tomcat轻小,而We ...
- DB数据源之SpringBoot+MyBatis踏坑过程(二)手工配置数据源与加载Mapper.xml扫描
DB数据源之SpringBoot+MyBatis踏坑过程(二)手工配置数据源与加载Mapper.xml扫描 liuyuhang原创,未经允许进制转载 吐槽之后应该有所改了,该方式可以作为一种过渡方式 ...
随机推荐
- 紫书 例题 10-1 UVa 11582 (unsigned long long+模)
(1)这道题要用到 unsigned long long, 弄了我好久 这道题范围可以达到2的64次方-1, 而long long 最多到2的63次方-1, 而unsigned long long可以 ...
- 【codeforces 22C】 System Administrator
[题目链接]:http://codeforces.com/problemset/problem/22/C [题意] 给你n个点; 要求你构造一个含m条边的无向图; 使得任意两点之间都联通; 同时,要求 ...
- Maven项目的坐标GroupId和ArtifactId
GroupId和ArtifactId被统称为“坐标”是为了保证项目唯一性而提出的,如果你要把你项目弄到maven本地仓库去,你想要找到你的项目就必须根据这两个id去查找. GroupId一 ...
- ZOJ 2601 Warehouse Keeper
Warehouse Keeper Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on ZJU. Origin ...
- [MST] Attach Behavior to mobx-state-tree Models Using Actions
Models are not just a nifty feature for type checking. They enable you to attach behavior to your ac ...
- VMware 下扩展linux硬盘空间
linux下扩展硬盘有非常多种方式,在扩展之前.尽量看看自己的空间存在的有哪些盘,然后再进行扩展. 假设是扩展的话,磁盘的符号和已经有的符号一样,比方都是sda的设备,知识分区不同.可能是sda3 s ...
- HDU 4288-Coder(模拟)
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- DNS RR代码和含义
记录类型 代码 号码 定义的 RFC 描述 功能 A 1 RFC 1035 IP 地址记录 传回一个 32 比特的 IPv4 地址,最常用于映射主机名称到 IP地址,但也用于DNSBL(RFC 110 ...
- Linux中的find命令
.递归查找(find 命令 是递归遍历文件夹的) 命令:find . -name “*.txt” //当前路径下递归查找以.txt结尾的文件夹 .不递归查找 find . -name “*.txt” ...
- 8.变量内存CPU原理
编译器先明确是什么类型,然后明确变量名,变量表管理所有的变量,不在变量表内部的变量不能引用.每个变量对应一整块内存 a+1所计算出来的值在寄存器中,只有变量可以被赋值,变量必须在内存里面 c语言内嵌汇 ...