1.Tomcat是一个web容器,将web项目存放于Tomcat的webapps目录下,并启动Tomcat就可以启动项目。那么tomcat是如何工作的呢?为什么自己的项目放进webapps下就可以启动呢?
2.我们知道Java项目能够运行一定要有一个main方法,那么我们写的项目的main方法在哪里呢?是没有main方法吗?
Java项目启动一定要有main方法作为入口的,我们要启动的Java项目的main方法并不是在项目中,是在Tomca中,Tomcat中有一个main,Tomcat启动后是从main方法开始的,Tomcat的main方法在org.apache.catalina.startup.Bootstarp类中。
我们的项目只是tomcat启动时加载的一个Context容器而已。
那么我们先看一下Tomcat的整个架构图:
Tomcat这样进行分层最大的好处就是启动、管理、扩展方便,每个组件自己所负责的职责就很明显。就像Web项目里的MVC进行分层之后,各自负责的任务就很明确。比如server组件主要负责全局的监听和配置文件加载。connector负责接收请求。
下面看一下各个容器都是负责什么任务:
Service:Tomcat的顶级容器,在Tomcat中是StandardService类,org.apache.catalina.core.StandardService是全类名。
---提供监听器机制,用于在Tomcat整个生命周期中对不同时间进行处理;
---提供Tomcat容器全聚德命名资源实现;
---监听某个端口已接收SHUTDOWD命令;
下面这个是StandardServer.java文件的源代码。由于格式问题并不能全部截屏出来。(可自行下载源码进行查看)
虽然没有全部截图,但是我们可以看到StandardServer类实现了LifecycleMBeanBase类和接口Server。 我们可以看下StandardServer的继承关系图。
StandardServer实现了Server接口,Server接口是规定了本组件的一个接口,有其他接口Service,Engine,Context等接口。自己是哪个组件就实现哪个接口。其中LifecycleMBeanBase是一个抽象类,主要是负责实现MBeanRegistration接口和LifecycleBase抽象类中可统一实现的方法的一个中间层类。LifecycleBase一样的概念,我们只需要了解MBeanRegistration接口和Lifecycle接口的作用即可。
Lifecycle接口截图
Lifecycle是管理生命周期的一个类,在Tomcat中几乎所有组件实现了这个接口,由此可见Tomcat的组件都是通过Lifecycle进行统一管理的。截图中的两个红框是它定义的接口方法和字段,详细信息请看生命周期解析文章。
并且Tomcat的Lifecycle中通过钩子方法和具体的组件进行特色的区分。
钩子方法:比如init()方法,在Server和service中有不同的初始化方案要进行初始化,那么就在LifecycleBase抽象类中实现init()方法,并在init()方法中设置一个方法initInternal(),initInternal()在根据不同的接口实现类去实现他们各自的需要。
比如server在initInternal()方法中初始化service等。
MBeanRegistration是负责Java JMX框架提供的注册MBean的接口,引入此接口是为了便于使用JMX提供的管理功能;
Tomcat的其他容器都是以这样的模式进行构造的。比如Service,Context,Host,Engine等。
Tomcat还有的其他知识:比如一个请求的处理过程,servlet的封装过程,tomcat的启动、停止过程,tomcat加载配置文件对象和组件,tomcat的Context的加载项目过程,解析servlet过程等问题。