1、从server.xml看tomcat的结构
tomcat的结构可以从server.xml文件看出一二,例如server包含service,而service包含engine,engine中包含host。 去除监听器、用户登录等配置,server.xml如下:
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path = "/word" docBase = "G:\java\web\hello" />
</Host>
</Engine>
</Service>
</Server>
转换成图如下图所示:
各个结构含义如下:
server:代表一个tomcat实例,同时所有的配置都应该在server标签之间,经过解析后,server标签会生成对应的org.apache.catalina.Server对象。
service:代表一个服务,同样解析后会生成对应的org.apache.catalina.Service。
connector:连接器,作用是监听端口,接收socket请求,并交由容器处理。较老版本的tomcat会生成org.apache.catalina.Connector对象,这是一个接口,新版本的会生成对应的org.apache.catalina.connector.Connector对象,这是一个类。如上图,一个Service是可以有多个connector的,只要监听的端口不同。
容器:
Engine:引擎,一个引擎可以包含多个Host,解析后会生成对应的org.apache.catalina.Engine对象。
Host:主机,例如访问的localhost就是tomcat的默认配置。解析后会生成对应的org.apache.catalina.Host对象。
Context:应用上下文,具体部署的服务。解析后会生成对应的org.apache.catalina.Conext对象。
其他组件:
Valve:阈,在容器处理请求前,会由一个叫做Pipeline的组件调用Valve,容器可以有多个Valve,在tomcat4.x和5.x,是使用Valve数组的形式来循环遍历调用的,但tomcat7之后是基于链的形式调用的。 解析后会生成相应的org.apache.catalina.Valve对象。
Listener:监听器,tomcat在启动、停止等生命周期的相应操作。解析后会生成org.apache.catalina.LifecycleListener对象。
以上就是基本可以从server.xml文件中读出的配置,但还有一些其他组件配置,例如Host中的Realm。
2、从源码看tomcat的结构
2.1、 Server组件
public interface Server extends Lifecycle {
//接口方法略
}
编写Servlet应该知道,Servlet有初始化、销毁、服务的生命周期。在tomcat中,用org.apache.catalina.Lifecycle来表示生命周期,用org.apache.catalina.LifecycleListener接口表示生命周期监听器,用org.apache.catalina.LifecycleEvent表示生命周期的各个事件,比如启动、停止、销毁、启动前等事件。同时tomcat还添加了许多XXSuport类来简化组件处理监听器事件和生命周期事件。