![0f96e989e4103639f58a2b995be6422f.png](https://i-blog.csdnimg.cn/blog_migrate/baa95f9ef69616a9870f9b183408a778.jpeg)
最近在学习tomcat结构与流程在翻看到一篇不错的博客
自己用脑图总结一下思路,想要流程图的同学可以私我
![f428916150a78171b6c1c5cd240c5b24.png](https://i-blog.csdnimg.cn/blog_migrate/81383def9986350f119767a44170c68b.jpeg)
![50efd42877821437b6fbd86d7f92d4c7.png](https://i-blog.csdnimg.cn/blog_migrate/3ab100885ffd3abd502f31ae927c5df3.jpeg)
19,12/29 周日
访问 http:// localhost:8080/docs 可以查看tomcat官方文档,如果返回404,调试代码会走到默认DefaultServlet,在这里会将Response 的status属性(默认为200)更新为404。
StandardPipeline.java
public class StandardPipeline extends LifecycleBase
implements Pipeline, Contained {
/**
* Construct a new StandardPipeline instance that is associated with the
* specified Container.
*
* @param container The container we should be associated with
*/
public StandardPipeline(Container container) {
super();
setContainer(container);
}
}
ContainerBase.java
public abstract class ContainerBase extends LifecycleMBeanBase
implements Container {
/**
* The Pipeline object with which this Container is associated.
*/
protected final Pipeline pipeline = new StandardPipeline(this);
}
![c4febcebeacd733ab62ee44289f674ea.png](https://i-blog.csdnimg.cn/blog_migrate/8a43723fbfe97a9b8f0e811e0c54ef89.png)
StandardPipeline实例化在容器抽象类ContainerBase,所以容器组件初始都化会加载,这里的super() 应该要加载父类的无参构造,但是StandardPipeline的父类都是抽象或者接口类,并且直接父类LifecycleBase也没有重写自己的构造,所以这里的super()是要干啥?StandardEngine,StandardHost,StandardContext,StandardWrapper重写的构造方法也一样。
每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。>_<(迷茫脸~),为了这个?
![9d88a32d8545d28fdcc9749addf2a468.png](https://i-blog.csdnimg.cn/blog_migrate/a2c0cd1df371e6f2e5f270dad4059fca.jpeg)
![28487f277c58313953afb41fe4db2ca8.png](https://i-blog.csdnimg.cn/blog_migrate/30d03af2e5e671cf4ffe7a01af0e4241.png)
![0d98d62af449d52f95d14432c88637ad.png](https://i-blog.csdnimg.cn/blog_migrate/4429cdf5a6996964d11aecea668cc5c3.png)
![fd3bcfb4d6a0d7f49f0546853619fe1b.png](https://i-blog.csdnimg.cn/blog_migrate/deb60d1172cec53d138c22c17ca22a7b.png)
Lifecycle 定义Tomcat组件生命周期规范。
Server 代表整个Tomcat Servlet顶级组件。它的属性代表Servlet容器整体的特征。一个Server 可能包含一个或多个Services ,以及顶级命名资源集。在一个JVM中只会包含一个Server,Server整个生命周期中,不同阶段会有不同的事情要完成。为方便扩展,引入了监听器方式,所以它也包含了Listener组件。为方便Tomcat继承JNDI,引入了GlobalNameingResources组件。同时,还包含了Service组件。
Server->Service 是一个或多个的组共享单个容器的连接器处理他们的传入请求。例如,这种安排允许 非SSL和SSL连接器以共享相同数量的Web应用。给定的JVM可以包含任意数量的Service实例。但是,它们是彼此完全独立,并且仅共享基本的JVM设施和系统类路径上的类Service是服务的抽象,它代表的是从请求接受到处理的所有组件的集合。包含若干个接受请求的Connect和处理请求的Engine组成Service组件。Service 还包含了若干个Executor组件来为Service 内所有组件提供线程池执行任务。
![e461099a52ecba647226717bf3db9681.png](https://i-blog.csdnimg.cn/blog_migrate/2895dbdcfa231a6f7961a776467c8c8c.jpeg)
Server->Service->Connector 主要职责是接收客户端请求并解析消息报文,送往容器处理。因为通讯协议的不同,所以需要不同的Connector组件。例如HTTP协议,AJP协议。
Server->Service->Container 可以执行从客户端接收到的请求的一个对象,并根据这些请求返回响应。容器也可以选择通过实施管道接口来支持按运行时配置的顺序处理请求的阀门管道。
Server->Service->Container->Engine 是代表整个Catalina Servlet 引擎的容器,Engine作为Catalina顶级容器可以使用拦截器来查看整个引擎处理的每个单个请求,使用独立的HTTP连接器运行支持多个Host虚拟主机。
Server->Service->Container->Engine->Host 表示Catalina Servlet引擎中的虚拟主机。
20,1/1 周三
Server->Service->Container->Engine->Host->Context 它表示Catalina Servlet引擎中的servlet上下文,并且因此是一个单独的Web应用程序。
Server->Service->Container->Engine->Host->Context->Wrapper 是一个容器,代表Web应用程序的部署描述符中的单个servlet 定义。Wrapper的实现负责管理其基础Servlet类的Servlet生命周期,包括在适当的时间调用init()和destroy(),并尊重Servlet类本身上存在SingleThreadModel声明。实现中不允许使用子容器,因此addChild()方法应抛出一个IllegalArgumentException异常
Realm 用于对单个用户进行身份验证并标识与这些用户关联的安全角色的基础安全领域的只读外观。Realm可以附加到任何容器级别,但通常仅附加到Context或更高级别的Container。
Realm其实是tomcat的安全策略体现,配置Realm 可以对容器组件设置了访问权限
![17c85c94077e32ce733d724d1b119022.png](https://i-blog.csdnimg.cn/blog_migrate/7694f6556516cfc76e498c94c4e3c0f9.jpeg)