设为首页 收藏本站
查看: 1241|回复: 0

[经验分享] Tomcat中容器是什么以及容器与容器之间的数量关系。

[复制链接]

尚未签到

发表于 2018-12-7 06:28:49 | 显示全部楼层 |阅读模式
  https://www.cnblogs.com/GooPolaris/p/8111837.html
Tomcat容器到底是什么
  学java有一小段时间了,一直使用Tomcat,也知道Tomcat是一个大的Servlet容器,里面还有许多子容器,容器之间都是相互嵌套的。也看过一下接收Tomcat的文章,都是一幅图,图中有好多个框框相互嵌套,表示容器与容器之间的相互嵌套,也没什么说明,把我看得云里雾里的。所以要想了解的更多必须自己探索一下。
  现在把自己学到的一点点知识记下来,以免忘记了。
  都说Tomcat是一个容器,那么这个容器到底是什么东西,因为说它是一个容器我还是觉得有点抽象,而我看了很多文章都没看到有人说。所以,我想知道Tomcat的本质。脑袋有点转不过弯来,写到这里才发现既然Tomcat是用java写的那它的容器的本质应该就是java类啦。
  在开始探索之前我就知道Tomcat中有Server、Service、Engine、Host.....等容器。这些容器与容器之间相互嵌套。既然这些容器的本质就是实实在在的java类(容器就是java类,已经够具体了,这样我才能理解,因为我天天写java类^v^ ),那这些不同的容器分别使用什么样的java类来描述的呢???我点是我想要知道的。
  经过一番探索,知道这些容器都是有生命周期的java类,他们都继承了共同的接口 Lifecycle 。所以Lifecycle就是这些容器这些java类的顶层接口了。下面是我画的继承体系图。
  图一:图片保存下来看吧,博客园的图片编辑无语,改天好好研究一下怎么让他弹出来再改。

  通过图中的类名就可以知道哪些类是表示Server,哪些是表示Service哪些是。。。。。。
  Tomcat中的这些容器都是有生命周期的容器,那么它的类肯定就有声明周期方法了。先看看顶层接口 Lifecycle ,这个接口里面主要定义了一些生命周期的方法。所以,继承自这个接口的所有容器都有生命周期。
  图二:

  init()方法:初始化容器组件,它必须在启动容器之前调用。它会创建许多对象。
  start():启动容器,比如启动一个Server。
  stop():停止执行
  destroy():销毁这个容器。
  Server容器:一个StandardServer类实例就表示一个Server容器
  Service容器:一个StandardService类实例就表示一个Service容器
  Engine容器:一个StandardEngine类实例就表示一个Engine容器。
  Host容器:一个StandardHost类实例就表示一个Host容器。
  Context容器:一个StandardContext类实例就表示一个Context容器。
  Wrapper容器:一个StandardWrapper类实例就表示一个Wrapper容器。
  以上一共有六种类型的容器,从上到下嵌套,也就是Server容器里面有Service容器,Service容器里面有Engine容器。。。。。。这就是这些容器之间的嵌套关系。
  需要注意的是,这些容器之间存在父子关系,但是他们对应的java类之间却不是父子关系。由图一可以看出来。
父容器与子容器之间的数量关系
  这些父容器和子容器之间有什么样的数量关系呢???
  一个Server容器可以有多个Service容器
   /**  
     * The set of Services associated with this Server.用一个数组来保存子容器的引用     */
  
    private Service services[] = new Service[0];
  一个Service容器只可以有一个子容器。

  
     Container container = ;

  这里用Container来表示子容器,根据图一可以看出,Container是Engine、Host、Context、Wrapper
接口的父接口,所以Service容器下面的子容器可能是Engine、Host、Context、Wrapper。但是我觉得一般情况下Service的子容器都是Engine容器吧。
  一个Engine容器里面可以有多个 Host 容器

    /**  
     * Add a child Container, only if the proposed child is an implementation
  
     * of Host.
  
     *
  
     * @param child Child container to be added     */
  
    @Override    public void addChild(Container child) {        if (!(child instanceof Host))//这里说明Engine的子容器只能是Host            throw new IllegalArgumentException
  
                (sm.getString("standardEngine.notHost"));        super.addChild(child);
  

  
    }

  一个Host容器里可以有多个 Context 容器。

    /**  
     * Add a child Container, only if the proposed child is an implementation
  
     * of Context.
  
     *
  
     * @param child Child container to be added     */
  
    @Override    public void addChild(Container child) {
  

  
        child.addLifecycleListener(new MemoryLeakTrackingListener());        if (!(child instanceof Context))//这里说明Host容器的子容器只能是Context容器            throw new IllegalArgumentException
  
                (sm.getString("standardHost.notContext"));        super.addChild(child);
  

  
    }

  一个Host容器中可以有多个Wrapper容器。

    /**  
     * Add a child Container, only if the proposed child is an implementation
  
     * of Wrapper.
  
     *
  
     * @param child Child container to be added
  
     *
  
     * @exception IllegalArgumentException if the proposed container is
  
     *  not an implementation of Wrapper     */
  
    @Override    public void addChild(Container child) {        // Global JspServlet
  
        Wrapper oldJspServlet = null;        if (!(child instanceof Wrapper)) {//这里说明Context容器的子容器只能是Wrapper容器。            throw new IllegalArgumentException
  
                (sm.getString("standardContext.notWrapper"));
  
        }
  
      //这里删除了部分代码
  
    }

  Wrapper容器下面不允许再有子容器。Wrapper容器是最底层的容器。如果添加子容器的话会抛出异常。

    /**  
     * Refuse to add a child Container, because Wrappers are the lowest level
  
     * of the Container hierarchy.
  
     *
  
     * @param child Child container to be added     */
  
    @Override    public void addChild(Container child) {        throw new IllegalStateException
  
            (sm.getString("standardWrapper.notChild"));
  

  
    }

  服务器接收到请求信息后如何传到我们编写的HttpServlet的呢??如果是SpringMVC的话会先到DispatcherServlet再到Controller,而DispatcherServlet也是HttpServlet的一个间接子类。在下一篇文章Tomcat是如何将请求一步步传递到我们编写的HttpServlet类中的



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-644083-1-1.html 上篇帖子: tomcat7启动报错:java.lang.NoSuchMethodException: 下篇帖子: 菜鸟学Linux 第100篇笔记 tomcat 之 java-Winthcloud
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表