`

Tomcat4 源代码分析 (6) How Tomcat Works 第六章

阅读更多

Chapter 6 : Lifecycle

 

1.

    Lifecycle接口:

    Lifecycle

public interface Lifecycle {
   public static final String START_EVENT = "start";
   public static final String BEFORE_START_EVENT = "before_start";
   public static final String AFTER_START_EVENT = "after_start";
   public static final String STOP_EVENT = "stop";
   public static final String BEFORE_STOP_EVENT = "before_stop";
   public static final String AFTER_STOP_EVENT = "after_stop";


   public void addLifecycleListener(LifecycleListener listener);
   public LifecycleListener[] findLifecycleListeners();
   public void removeLifecycleListener(LifecycleListener listener);
   public void start() throws LifecycleException;
   public void stop() throws LifecycleException;
}

     每一个component都是一个Lifecycle接口的实现。都需要实现其中的方法。

 

    LifecycleEvent是传递的事件的类型。

 

    LifecycleListener类里面含有一个方法:lifecycleEvent(LifecycleEvent event)。这个方法里面就是事件发生后,所触发的动作。

 

    swing中的事件机制可以帮助理解:

 

        ColorAction yellowAction = new ColorAction(Color.YELLOW);
        yellowButton.addActionListener(yellowAction);
     
  

   private class ColorAction implements ActionListener
   { 
      public ColorAction(Color c)
      { 
         backgroundColor = c;
      }

      public void actionPerformed(ActionEvent event)
      { 
         setBackground(backgroundColor);
      }

      private Color backgroundColor;
   }

 这里边,LifecycleListener == ActionListener  

ActionEvent == LifecycleEvent  

yellowButton == Container

接下来的SimpleContextLifecycleListener == ColorAction

yellowButton的addActionListener方法类似于SimpleContext的addLifecycleListener方法。

 

2、LifecycleSupport类

 

    这是一个运行在底层的类。这是SimpleContext类的一个属性(SimpleContext的listener的相关的方法实际上都是由调用LifecycleSupport类的方法来完成)。这个类的理解也有助于理解swing的事件机制的底层实现。

    这个类的主要方法有:

    addLifecycleListener()// SimpleContext调用add listener时,调用的就是这个方法

    removeLifecycleListener()// 同上

    fireLifecycleEvent()// 当一个事件发生时,这个方法被调用。这个方法会依次调用所有LifecycleListener接口中的lifecycleEvent方法。

    所有的listener都是放在一个数组中维护的。具体算法看书。

 

3、Lifecycle在application中的使用

 

    由于众多的组件都有生命周期的概念(即都实现了Lifecycle接口)。在启动关闭的时候,相应的start stop方法都需要调用。这里每一个组件lifecycle方法的调用我们只需要在最高层container层(connector层)调用其start stop方法,他们便会自动的调用子容器的lifecycle方法。

 

    首先,有必要先里清楚各个组件之间的依赖关系:

    Connector connector = new HttpConnector();//连接器
    Wrapper wrapper1 = new SimpleWrapper();//第一个wrapper容器
    wrapper1.setName("Primitive");
    wrapper1.setServletClass("PrimitiveServlet");
    Wrapper wrapper2 = new SimpleWrapper();//第二个wrapper容器
    wrapper2.setName("Modern");
    wrapper2.setServletClass("ModernServlet");

    Context context = new SimpleContext();//context容器
    context.addChild(wrapper1);//给context容器添加wrapper子容器
    context.addChild(wrapper2);//给context容器添加wrapper子容器

    Mapper mapper = new SimpleContextMapper();//创建mapper
    mapper.setProtocol("http");
    LifecycleListener listener = new SimpleContextLifecycleListener();//创建listener
    ((Lifecycle) context).addLifecycleListener(listener);//context容器添加listener
    context.addMapper(mapper);//context添加mapper
    Loader loader = new SimpleLoader();//创建loader
    context.setLoader(loader);//context容器添加loader
    // context.addServletMapping(pattern, name);
    context.addServletMapping("/Primitive", "Primitive");
    context.addServletMapping("/Modern", "Modern");
    connector.setContainer(context);
    try {
      connector.initialize();
      ((Lifecycle) connector).start();
      ((Lifecycle) context).start();//启动生命周期

      // make the application wait until we press a key.
      System.in.read();
      ((Lifecycle) context).stop();
    }
    catch (Exception e) {
      e.printStackTrace();
    } 

 

    其次,需要跟踪一下context 的 start方法中的一句话:

lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);

      这里的lifecycle对象是LifecycleSupport类型。这个fireLifecycleEvent方法如下:

public void fireLifecycleEvent(String type, Object data) {

        LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);
        LifecycleListener interested[] = null;
        synchronized (listeners) {
            interested = (LifecycleListener[]) listeners.clone();
        }
        for (int i = 0; i < interested.length; i++)
            interested[i].lifecycleEvent(event);

    }

    可见,在一个事件发生以后,fire方法会进而调用listener接口的lifecycleEvent方法,从而使得监听器方法执行。

   

4、

    本章的例子中,container容器 context wrapper 都注册了监听器。而其它组件都没有注册。所以在事件触发时,container的监听器会有相应的动作;其他组件只是简单的执行start stop 方法中的动作。

 

 

    (完毕)

分享到:
评论

相关推荐

    How Tomcat Works【英文PDF+中文HTML+源码】.zip

    《How Tomcat Works》是一份深入探讨Apache Tomcat工作原理的重要资源,包含了英文PDF文档、中文HTML翻译以及源代码,旨在帮助读者理解Tomcat服务器的内部运作机制。这份资料是IT从业者,特别是Java Web开发者、系统...

    HowTomcatWork 源代码

    《How Tomcat Works》这本书及其源代码,为开发者提供了深入理解Tomcat内部工作机制的宝贵资源。本文将基于提供的文件名"如何Tomcat工作",结合Tomcat的工作流程,深入探讨其核心组件和功能。 1. **Tomcat架构概述*...

    How Tomcat Works 中文版

    在《How Tomcat Works》这本书中,作者详细剖析了Tomcat的内部工作机制,特别是对Tomcat的4.1.12和5.0.18两个版本的源代码进行了深入的分析。本书通过逐步揭示Tomcat的各个组件,帮助读者理解Tomcat的内部结构和运作...

    How Tomcat Works 英文书及源码

    通过阅读和理解Tomcat的源代码,可以深入了解其内部工作流程,从而提升自定义扩展和调试的能力。《HowTomcatWorksApps.zip》这个压缩文件可能包含了一些示例应用或代码片段,供读者实践和研究。 总的来说,《How ...

    How Tomcat Works以及案例的项目源码

    4. **JSP编译**:Tomcat在首次遇到JSP页面时,会将其转换为Servlet源代码并编译成.class文件。这个过程涉及JSP标签库、EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)的解析。 5. **...

    How Tomcat Works 中文版/英文版 + 源码

    《How Tomcat Works》是一本深入解析Apache Tomcat服务器内部工作原理的重要参考资料,它提供了对Tomcat架构的全面理解,包括其设计、配置和优化。这本书的中文版和英文版都为读者提供了便利,无论你是母语为中文...

    HowTomcatWorks 中文版+源码.rar

    《HowTomcatWorks》是一本深入解析Apache Tomcat工作原理的书籍,中文版的发布使得更多的中国开发者能够理解和掌握这款广泛应用的开源Java Servlet容器的工作机制。Tomcat是Apache软件基金会Jakarta项目的一部分,它...

    how tomcat works

    作为一本面向中高级开发者的书籍,《how tomcat works》不仅为读者提供了丰富的理论知识,还提供了许多实用的示例和源代码分析,帮助读者更好地理解概念,并应用到实践中去。例如,书中提到了如何为Tomcat实现自定义...

    how-tomcat-works-master_howtomcatworks_

    "how-tomcat-works-master_howtomcatworks_"是一个关于Tomcat工作原理的源码分析项目,经过整理后可以在IntelliJ IDEA中直接运行,为开发者提供了一手的实践平台。 首先,我们要了解Tomcat的核心组件。Tomcat主要由...

    HowTomcatWorks-master.zip

    "HowTomcatWorks"项目,正如其名,旨在帮助开发者了解Tomcat的工作原理,通过源代码分享,使我们有机会深入探究这个强大的服务器内部机制。 1. **Tomcat架构概览** Tomcat的架构设计分为几个主要部分:Catalina...

    how tomcat works( 深入剖析tomcat) 的随书源码

    《深入剖析Tomcat》这本书是Java开发者们了解和学习Tomcat服务器的重要参考资料,它详细解析了Tomcat的工作原理和内部机制。随书源码则为读者提供了实践和探索的平台,帮助读者更深入地理解书中的理论知识。下面将...

    how tomcat work_中文版(源码)

    而"HowTomCatWorks"很可能是源码的目录或者解压后的源代码文件,读者可以直接查看和分析Tomcat的源代码,这对于深入学习和定制Tomcat非常有帮助。 总的来说,这份资料对于想要深入了解Tomcat、提升服务器性能的...

    译How Tomcat Works(第四章)

    《译How Tomcat Works(第四章)》这篇文章深入解析了Apache Tomcat服务器的工作原理,主要聚焦于Tomcat的内部机制,对于理解Web应用容器的运行方式具有重要意义。Tomcat是Java Servlet和JavaServer Pages(JSP)...

    how tomcat works和jetty-src和tomcat7-src

    【标题】"how tomcat works和jetty-src和tomcat7-src" 提及了三个关键概念:Tomcat的工作原理、Jetty源代码以及Tomcat 7的源代码。这些是Java Web服务器领域的核心元素,主要涉及到如何处理HTTP请求、部署Web应用...

    How Tomcat Works 中文版+源码+书里面对应tomcat源码(4.1.12 5.0.18)和编译后文件

    而"jakarta-tomcat-4.1.12-src.zip"和"jakarta-tomcat-5.0.18-src.zip"则包含了对应版本的源代码,这些源代码对于学习Tomcat的架构设计、模块划分以及代码实现非常关键。同时,源码包通常还包括构建脚本,读者可以...

    how tomcat works 中文版 1-20章

    how tomcat works 中文版 1-20章 现在全了 不光前四章 感谢 macula7 的空间 http://hi.baidu.com/macula7/blog/item/81fd14cbb7059f8dc81768d8.html 其翻译了 how tomcat works 还写了tomcat源代码学习

    How tomcat works

    《How Tomcat Works》是一份详细阐述Tomcat工作原理的资源,包含英文版电子书和源代码。Tomcat是Apache软件基金会的项目,它是一个开源的Java Servlet容器,广泛用于部署Java Web应用程序。这份资料旨在帮助读者深入...

    howtomcatworks tomcat运行内幕

    本篇文章将深入剖析"HowTomcatWorks",帮助读者全面理解Tomcat的内部工作机制。 1. **Tomcat架构概述** Tomcat由一系列组件构成,包括Catalina(核心Servlet容器)、Jasper(JSP引擎)、 Coyote(HTTP/HTTPS连接器...

Global site tag (gtag.js) - Google Analytics