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容器只可以有一个子容器。

/**
* The Container associated with this Service. (In the case of the
* org.apache.catalina.startup.Embedded subclass, this holds the most
* recently added Engine.)
    它不是用一个数组来保存子容器的引用的。所以直接的子容器只有一个。
*/
protected Container container = null;

这里用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类中的

Tomcat中容器是什么以及容器与容器之间的数量关系。的更多相关文章

  1. 走进JavaWeb技术世界7:Tomcat中的设计模式

    . 门面设计模式 门面设计模式在 Tomcat 中有多处使用,在 Request 和 Response 对象封装中.Standard Wrapper 到 ServletConfig 封装中.Appli ...

  2. Tomcat中的Host和Engine级别的servlet容器

    这边文章主要介绍的是Host容器 和 Engine容器.如果你想在同一个Tomcat上部署运行多个Context容器的话,你就需要使用Host容器,从理论上来讲,如果你的Tomcat只想要部署一个Co ...

  3. Tomcat实现分析(一)--类加载及容器组件

    启动脚本 启动命令中的参数如下: org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/opt/ap ...

  4. 以Tomcat+Mysql为例,实现Docker多容器连接

    Docker提供了多个容器直接访问的方法,最简单的方式是直接使用端口映射-p参数指定映射的端口或者-P映射所有端口,多个容器直接通过网络端口进行访问. 但网络端口映射方式并不是Docker中连接多个容 ...

  5. tomcat、weblogic、jboss的区别,容器的作用

    一.tomcat Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,它是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心 ...

  6. 学习Tomcat(五)之Context和Wrapper容器

    前面的文章中,我们介绍了Tomcat的Engine和Host容器,我们知道一个Tomcat最多只有一个Engine容器,一个Engine容器可以包含多个Host容器,请求中的不同的Host对应不用的H ...

  7. MFC中开发ocx控件,html容器收不到ocx的事件Event

    问题背景: MFC开发ocx控件,主窗口就是ctrl类,主窗口类中调度接口和事件映射添加,执行OK,外部html容器中接收事件成功,如下: ctrl.h中声明事件映射函数 void EVTPENSIG ...

  8. 【VS开发】在VS2010中开发ActiveX控件设置测试容器的方式

    在VS2010中开发ActiveX控件设置测试容器的方式 借鉴文章http://blog.csdn.net/waxgourd0/article/details/7374669 在VS2010中开发MF ...

  9. docker常用命令,及进入Tomcat的WebApps发布目录(就是进入docker容器后台目录)

    docker常用命令,及进入Tomcat的WebApps发布目录(就是进入docker容器后台目录)   一.常用命令 1.显示所有的容器,包括未运行的 docker ps -a   2.启动容器.注 ...

随机推荐

  1. 使用 Angular 和 RxJS 实现的无限滚动加载

    无限滚动加载应该是怎样的? 无限滚动加载列表在用户将页面滚动到指定位置后会异步加载数据.这是避免寻主动加载(每次都需要用户去点击)的好方法,而且它能真正保持应用的性能.同时它还是降低带宽和增强用户体验 ...

  2. 深入理解 flex 布局以及计算_Flexbox, Layout

    起因 对于Flex布局,阅读了 大漠老师和其他老师写的文章后,我还是不太理解Flexbox是如何弹性的计算子级项目的大小以及一些其他细节.在大漠老师的帮助下,我去查阅Flexbox 的 W3C 规范文 ...

  3. 使用http维持socket长连接

    项目中有遇到问题如下: 1.旧版的cs服务,因为每个用户和唯一的长连接是在登录后绑定的,并且所有的消息报文均是基于该长连接去发送接收的,所以要求node服务要维持一个长连接,然后根据该用户获取长连接, ...

  4. SpringMVC笔记:annotation注解式开发

    一.配置式开发 在我们之前的学习中,springmvc使用配置式开发模式,需要在核心配置文件中springmvc.xml注册大量的bean来注入controller控制器,工作繁琐容易出错,下面我们学 ...

  5. 判定 java 对象死亡的过程

  6. css实现修改默认滚动条样式

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head&g ...

  7. bzoj1201: [HNOI2005]数三角形----递推+bitset

    -by  bzoj http://www.lydsy.com/JudgeOnline/problem.php?id=1201 枚举所有交点,统计每个以每个点为顶点的正三角和和以每个点为左端点的反三角 ...

  8. 【SPOJ】MGLAR10 - Growing Strings

    Gene and Gina have a particular kind of farm. Instead of growing animals and vegetables, as it is us ...

  9. 洛谷P3384 树链剖分

    如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x ...

  10. git revert后导致合并代码丢失

    起因 我有一个开发分支antd3.x和一个主分支develop,我在合并antd3.x到develop的时候发现有些修改没有合并进来. 查找问题 然后就去网上查,发现这篇文章<git合并丢失代码 ...