Tomcat顶层结构及启动过程
tomcat最顶层的容器叫Server,代表整个服务器,一个tomcat只有一个。由org.apache.catalina.startup.Catalina管理(整个tomcat的管理类。其中的load()用于根据conf/server.xml创建Server并调用Server的init方法进行初始化;start()方法调用Server的start()用于启动服务器,stop()用于调用Server的stop()停止服务器.以上三个方法会逐层调用相应的方法;如Server的start()会调用Service的start(),Service的start()会调用其包含的Connectors和Container的start()方法,从而启动整个服务器)
Catalina中的await()方法直接调用Server的await方法,进入一个循环,让主线程不会退出。
Server中最少包含一个Service(可以有多个),用于具体提供服务
Service主要包含Connector(处理连接相关,并提供Socket与request、response的转换,一个Service可以有多个连接,如同时提供http和https连接或提供相同协议不同端口的连接)和Container(用于封装和管理Servlet以及具体的request请求,一个service只有一个容器)
tomcat的入口main()方法在org.apache.catalina.startup.Bootstrap中(作用类似一个CatalinaAdaptor,具体处理过程由Catalina完成)
Container(四个子接口:Engine Host Context Wrapper和一个默认实现类ContainerBase)是tomcat中容器的接口,通常Servlet就封装在其子接口Wrapper中. Container接口继承Lifecyle接口(默认实现LifecyleBase,管理生命周期的类)
Engine Host Context Wrapper都是一个容器,都由一个对应的实现类StandardXXX并extends ContainerBase.
四个子容器是逐层包含的关系(下图是最简化的情况):
Engine和Host配置在conf/server.xml中,直接使用Engine和Host标签。Host标签的name属性代表域名,appBase属性指定站点位置(如默认的webapp目录),unpackWARs属性表示自动解压war文件;autoDeploy=true则tomcat在运行过程中在webapps目录中加入新的应用会自动部署并启动。Host的Alias子标签用来定义别名(可以设置多个域名访问同一站点)
Context有三种配置方法:
1.通过文件配置(有5个位置可以配置:a.conf/server.xml的Context标签. b.conf/[enginename]/[hostname]下添加以应用命名的xml文件. c.应用自己的/META-INF/context.xml文件. d.conf/context.xml文件. e. conf/[enginename]/[hostname]/context.xml.default文件其中前三个用于配置单独的应用,后两个是共享的,d在整个tomcat中是共享的,e在对应的站点(Host)中共享. 另外conf/server.xml文件需要tomcat重启才能生效)
2.将WAR应用直接放到Host目录下,tomcat会自动查找并添加到Host中
3.将应用的文件夹放到Host目录中
Wrapper的配置就是在web.xml中配置Servlet,一个Servlet对应一个Wrapper;也可以在conf/web.xml文件中配置全局的Wrapper,处理Jsp的JspServlet就配置在这里。
同一个Service下的所有站点共享Connector,所以监听的端口一样,如想添加监听不同端口的站点,可以通过不同的Service来配置(在conf/server.xml中配置)