概述Tomcat是一个JSP/Servlet容器。作为一个Servlet容器,它有独立Servlet容器、进程内Servlet容器和进程外Servlet容器三种工作模式。Tomcat的组织结构Tomcat是一个基于组件的服务器,它的组件都是可配置的。最外层是Catalinaservlet容器,其他组件按照一定的格式要求配置在这个顶层容器中。Tomcat的各种组件配置在Tomcat安装目录下的/conf/server.xml文件中。从Server.xml的结构可以看出Tomcat的架构从上面我们可以得到Tomcat的架构:Tomcat的架构从上图我们可以看出Tomca的核心是两个组件:Connecter和Container。一个Container可以选择多个Connector,多个Connector和一个Container组成一个Service。Service可以对外提供服务,Server服务器控制着Tomcat的整个生命周期。组件的生命线“Lifecycle”Service和Server管理它下面的组件的生命周期。Tomcat中组件的生命周期是通过Lifecycle接口来控制的。一个组件只要继承了这个接口并实现了其中的方法,就可以被拥有它的组件所控制,从而层层控制,直到一个最高层的组件。在Tomcat中所有组件的生命周期中,最高的组件是Server,控制Server的是Startup,也就是你启动和关闭Tomcat。Tomca的两个组件:Connecter和ContainerConnecter组件Connecter会在指定的端口上监听客户端请求,接收浏览器发送的tcp连接请求,并分别创建一个Request和Response对象与请求端交换数据,然后生成一个线程来处理请求并将生成的请求和响应对象传递给处理引擎(容器的一部分),从引擎获取响应并返回给客户端。Tomcat中有两种经典的Connector,一种直接监听来自Browser的HTTP请求,一种来自其他WebServer的请求。CototeHTTP/1.1Connector在8080端口监听来自客户端浏览器的HTTP请求,CoyoteJK2Connector在8009端口监听来自其他WebServer的Servlet/JSP请求。Connector最重要的功能是接收连接请求,然后为它分配线程容器来处理请求,所以这个必须是多线程的,而多线程处理是Co??nnector设计的核心。Container组件Container的架构如下:Container容器的架构是容器的父接口。容器的设计是典型的责任链设计模式。它由四个自容器组件组成,分别是Engine、Host、Context、Wrapper。这四个组件存在主管关系和包含关系。通常一个Servlet类对应一个Wrapper。如果有多个Servlet定义多个Wrapper,如果有多个Wrapper,则必须定义一个更高的Container,比如Context。上下文也可以在父容器Host中定义。Host不是必须的,但是要运行war程序,Host是必须要的,因为war中必须有一个web.xml文件,解析这个文件需要Host。如果有多个Host就要定义一个topcontainerEngine。而Engine没有父容器,一个Engine代表一个完整的Servlet引擎。Engine容器Engine容器比较简单,它只定义了一些基本的关联Host容器Host是Engine的单词容器,一个Host代表Engine中的一个虚拟主机,这个虚拟主机的作用是运行多个应用,它负责安装和展开这些应用程序,并识别这个应用程序以便能够区分它们。它的子容器通常是Context,它不仅与子容器相关联,还保存了宿主机应该有的信息。Context容器Context代表Servlet的Context,具有Servlet运行的基础环境。理论上只要有Context,Servlet就可以运行。SimpleTomcat可以没有Engine和Host。Context最重要的功能就是管理其中的Servlet实例。Servlet实例在Context中显示为Wrapper。还有一点就是Context怎么才能找到正确的Servlet来执行呢?Tomcat5以前是通过一个Mapper类来管理的,Tomcat5之后,这个功能被移到了request中。在前面的时序图中可以发现,子容器的获取都是通过request分配的。Wrapper容器Wrapper代表一个Servlet,它负责管理一个Servlet,包括Servlet的加载、初始化、执行和资源回收。Wrapper是底层容器,它没有子容器,所以调用它的addChild会报错。Wrapper的实现类是StandardWrapper。StandardWrapper还使用Servlet初始化信息实现ServletConfig。可以看出StandardWrapper会直接处理Servlet的各种信息。Tomcat中的其他组件Tomcat还有其他重要的组件,如安全组件security、logger日志组件、session、mbeans、naming等组件。这些组件共同为连接器和容器提供必要的服务。TomcatServer处理一个HTTP请求的过程TomcatServer处理一个HTTP请求的过程TomcatServer处理一个HTTP请求的过程1.当用户点击网页内容时,请求发送到本地8080端口,其中CoyoteHTTP/1.1连接器被监控获取。2.Connector将请求交给所属Service的Engine处理,等待Engine的响应。3.Engine获取请求localhost/test/index.jsp,匹配所有虚拟主机Host。4.Engine匹配名为localhost的Host(即使没有匹配到,请求也交给Host处理,因为Host定义为Engine的默认主机),名为localhost的Host获取请求/test/index.jsp,匹配它拥有的所有上下文。Host匹配路径为/test的Context(如果没有匹配到,则将请求交给路径名为“”的Context处理)。5、path="/test"的Context获取请求/index.jsp,在其映射表中找到对应的Servlet。Context匹配URLPATTERN为*.jsp的Servlet,对应JspServlet类。6、构造HttpServletRequest对象和HttpServletResponse对象,调用JspServlet的doGet()或doPost()作为参数执行业务逻辑、数据存储等程序。7、Context将执行后的HttpServletResponse对象返回给Host。8.Host返回HttpServletResponse对象给Engine。9.Engine将HttpServletResponse对象返回给Connector。10.Connector返回HttpServletResponse对象给客户端Browser。
