首页 > 代码库 > tomcat加载web.xml
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 those12 * components that use a separate component to perform configuration and13 * need to signal when configuration should be performed - usually after14 * {@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 LifecycleListener42 是所谓的接收者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, IOException76 --------------》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
tomcat加载web.xml
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。