tomcat加载web.xml

这几天看tomcat的源码,疑问很多,比如之一“ tomcat 怎么加载 web.xml”,下面是跟踪的过程,其中事件监听器有一个观察者模式,比较好。记录下来以供参考

 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>tomcat load web.xml>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 2
 3
 4
 5    tomcat加载web.xml中用户的servlet到context中去,同时实例化该servlet到/WEB-INF/classes/中
 6    过程大致如下
 7
 8    由事件接收器 接收 到CONFIGURE_START_EVENT的消息后,才会触发处理加载web.xml的动作,
 9
10            /**
11              * The LifecycleEvent type for the "configure_start" event. Used by those
12              * components that use a separate component to perform configuration and
13              * need to signal when configuration should be performed - usually after
14              * {@link #BEFORE_START_EVENT} and before {@link #START_EVENT}.
15              */
16             public static final String CONFIGURE_START_EVENT = "configure_start";
17
18    那么又是谁来把该消息注册到监听器中的呢?如下,从启动过程中进行查找:
19
20
21  org.apache.catalina.startup.Bootstrap.start()
22   -->org.apache.catalina.startup.Catalina.start()
23   ----》load()
24   ------》
25      getServer().init();
26      Server==="org.apache.catalina.core.StandardServer"
27      -----》StandardServer.initInternal()
28        StandardServer.startInternal()
29              ---》
30                     void java.org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(String type, Object data)
31
32                             fireLifecycleEvent(CONFIGURE_START_EVENT, null);
33                              ---》
34                              LifecycleSupport fireLifecycleEvent(CONFIGURE_START_EVENT, null);
35
36                                 由LifecycleSupport 来广播给所有的接收者,
37                                  接收者根据需要来判断是否需要处理【此处用到观察者模式 】
38
39
40
41                              而public class ContextConfig implements LifecycleListener
42                              是所谓的接收者
43                              其重写的 lifecycleEvent(LifecycleEvent event)方法中
44
45                               if (event.getType().equals(Lifecycle.CONFIGURE_START_EVENT)) {
46
47                                configureStart();该方法是进行加载的具体方法
48
49
50             protected synchronized void configureStart()
51                  -----------------》webconfig()
52                                                         :::::
53
54                webconfig()中
55                            {
56                                                     String resource =
57                                                             "/WEB-INF/classes/" + binding.getName();
58                                                     try {
59                                                         URL url = sContext.getResource(resource);
60                                                         processAnnotationsUrl(url, webXml,
61                                                                 webXml.isMetadataComplete());
62                                                     } catch (MalformedURLException e) {
63                                                         log.error(sm.getString(
64                                                                 "contextConfig.webinfClassesUrl",
65                                                                 resource), e);
66                                                     }
67
68                            }
69
70    ---------------》
71     void java.org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(URL url, WebXml fragment, boolean handlesTypesOnly)
72                 ----------》
73                  void java.org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(URL url, WebXml fragment, boolean handlesTypesOnly)
74                         ------------》
75                              void java.org.apache.catalina.startup.ContextConfig.processAnnotationsStream(InputStream is, WebXml fragment, boolean handlesTypesOnly) throws ClassFormatException, IOException
76                                     --------------》
77                                          void java.org.apache.catalina.startup.ContextConfig.processAnnotationWebServlet(String className, AnnotationEntry ae, WebXml fragment)
78
79                                                  ---------》
80                                                   fragment.addServlet(servletDef);
81                                                   fragment.addServletMapping(urlPattern, servletName);
82
83
84     ------->webXml.configureContext(context);
85
86                  public void configureContext(Context context) {
87                       Wrapper wrapper = context.createWrapper();
88                       context.addChild(wrapper);
89                       context.addServletMapping(entry.getKey(), entry.getValue());
90
91   >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>tomcat load web.xml>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
92
93     
时间: 2024-07-30 14:47:22

tomcat加载web.xml的相关文章

Spring学习(一)tomcat加载web.xml、以及项目集成Spring支持

tomcat容器加载web.xml 一. 1 .启动一个 WEB 项目的时候, WEB 容器会去读取它的配置文件 web.xml ,读取 <listener> 和 <context-param> 两个结点. 2 .紧急着,容创建一个 ServletContext ( servlet 上下文),这个 web 项目的所有部分都将共享这个上下文. 3 .容器将 <context-param> 转换为键值对,并交给 servletContext . 4 .容器创建 <li

tomcat加载web.xml机制

原文: http://www.cnblogs.com/wky1680/archive/2013/03/13/2957109.html 一. 1.启动一个WEB项目的时候, WEB容器会去读取它的配置文件web.xml, 读取<listener>和<context-param>两个结点. 2.紧急着, 容创建一个ServletContext(servlet上下文), 这个web项目的所有部分都将共享这个上下文. 3.容器将<context-param>转换为键值对, 并交

tomcat加载web.xml的过程---StandardContext、ContextConfig源码分析

一个Context对应一个web应用,而一个web应用应该有一个web.xml 观察StandardContext的startInternal方法 startInternal() -> fireLifecycleEvent(Lifecycle.CONFIGURE_START_EVENT, null) -> child.start() -> mergeParameters() -> listenerStart() -> setApplicationEventListeners(

Tomcat(一):Tomcat启动时加载web.xml

server.xml配置文件样例: <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional inf

javaEE:day2-servlet生命周期、提交解决中文乱码、tomcat加载jar包或类文件的顺序

servlet生命周期 生命周期简介: servlet在服务器第一次被请求的时候new出来,并初始化(即init())再调用service方法.这个实在服务器中new出来,然后用HashMap加的,与客户端无关.客户端之后访问只调用这个servlet的service方法. 具体分为4步: 1 构造方法 :服务器在被客户端第一次请求的时候运行 仅在服务器中运行一次 2 init方法:客户端第一次访问服务器的时候在服务器中进行初始化 仅一次.并且可以通过config参数在 web.xml中通过(ke

TOMCAT加载两次war包(重复加载)

一.问题描述 项目中通过配置Context节点docBase,使docBase指向项目的绝对路径,可以直接通过IP加端口访问,今日发现意外bug,项目中某个功能奇数次执行成功,偶数次执行失败.二.问题排查 这种现象应该是两次使用的为不同的对象,通过debug确认问题.但是本来是单例模式实现的实例,调用的时候却不是同一个实例,经过排查发现是Tomcat加载war包两次导致的.三.解决办法 修改Tomcat的/conf/server.xml文件 1.将Host标签中的appBase置为空,在weba

C# .NET VS2010加载Web服务 传参失败

最近在做一个关于支付相关的项目,我们C#端是调用Java写的接口,调用过程中出现了一系列的问题,主要还是传参,以下是详细内容: 该问题的产生背景: .net向webservice传double.int.datetime到服务器,而得到的返回值为null的情况,比如用C#.NET调用Java开发的WebService时,先在客户端封装的带有int属性的对象,当将该对象传到服务器端时,服务器端可以得到string类型的属性值,却不能得到int类型.double和DateTime类型的值(在服务端得到

Eclipse中使用Tomcat加载项目在浏览器中访问的时候JS和CSS等静态文件无法加载的问题

首先,我的Eclipse是引用外部的Tomcat 引用外部Tomcat会在左侧生成一个Server文件夹,相当于复制了一份Tomcat到Eclipse的安装目录里 具体Tomcat所在目录可以在这进行查看 双击Tomcat服务,会打开一个窗口,然后点击Open launch configuration,可打开配置窗口,在这里可以查看到具体服务所在位置. 接下来步入正题,正如题目所说,Eclipse中使用Tomcat加载项目在浏览器中访问的时候JS和CSS等静态文件无法加载,如图 仔细看下路径,会

SCOM 2012 R2应用程序事务监视无法加载Web Recorder插件

在配置SCOM 2012 R2的应用程序事务性监视的时候,发生在捕获网页的时候无法加载web recorder控件,经过检查IE的这个控件已经被我手动启用了,如图. 而且当前也是用管理员身份登录的,如图. 后来在网上找到了下面的解决方案. 这个方案是一个针对当前用户的一个修复的方案,为了避免原文的链接失效,现在把文章的内容附在下面,方便大家查看. =========================================================== Issue on record