上一篇我们介绍了Tomcat的Engine和Host容器。我们知道一个Tomcat至多有一个Engine容器,一个Engine容器可以包含多个Host容器。Requests不同的主机对应不同的主机容器。在本章中,我们将介绍Tomcat的另外两个容器:Context容器和Wrapper容器。一个Host容器可以包含多个Context容器:同一个Host可以包含多个应用,每个应用对应一个Context容器。一个Context容器可以包含多个Wrapper容器:每个Wrapper容器包含一个Servlet容器,这意味着Tomcat允许一个应用程序有多个servlet实现。Tomcat请求流程我们现在知道Tomcat最重要的组件是连接器和四种容器。下图显示了Tomcat请求如何在连接器和四种类型的容器之间流动。假设Http请求头为“GET/appB/servletB/some-urlHTTP/1.1Host:www.krishnan.com”,当请求访问Tomcat容器时,会经过以下流程步骤:Tomcat的connector监听SocketServer,找到这个请求,按照指定的协议,以IO方式处理请求的Socket报文,将Socket解析成对应的Request实体,并提供Response实体,用于写回消息。connector将Request/Response交给Engine容器,Engine容器存储请求域名与Host容器的映射关系。例如,“www.krishnan.com”域名对应于krishnan_webapps主机容器。Engine容器将请求传递给对应的Host容器,Host容器开始解析请求中的路径。如果配置了路径和应用的关系,比如“/appB”对应appB的Context容器,Host容器会安装配置,并将请求传递给对应应用的Context容器。Host容器解析路径后将应用交给Context容器,如果一个应用有多个Servlet,那么应用的Context容器也会包含多个Wrapper容器。我们可以通过路径将不同的请求映射到不同的Servlet容器中。比如图中的“/servletB”对应servletBWrapper容器,Context容器将请求传递给Wrapper容器。Context容器根据路径将请求发送给对应的Wrapper容器,Wrapper容器加载对应的Servlet实现类,调用servlet实现类中的逻辑处理Request,并将处理结果写入Response。Context容器我们在配置Tomcat应用的时候,总是需要配置一个web.xml文件,这个文件由Context容器来解析。tomcat默认的web.xml配置如下。该配置中配置了两个WrapperContext,对应两个Servlet配置。在web.xml中,我们经常可以看到listener标签,它主要用来监听Context容器的生命周期事件。
