catalina就是Tomcat服务器使用的 Apache实现的servlet容器的名字。
Tomcat的核心分为3个部分:
Web容器:处理静态页面。catalina:一个处理servlet的容器。JSP容器:把jsp页面翻译成一般的servlet。 Catalina
连接器负责将一个请求与容器相连。工作包括为它接收到的每个HTTP请求创建一个request对象和一个response对象。然后将处理过程交给容器。容器从连接器中接收到request对象和response对象,并负责调用相应的servlet的service方法。
Catalina是个相关的接口:Pipeline、Value、ValueContext、Container。
http1.1新特性 持久连接 块编码
Tomcat 的Servlet容器必须实现 Container接口。
Container中servlet容器包括4种类型的容器,其概念层次分别是:
Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine。Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点。Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件。可以包含一个或者多个子容器Wrapper实例作为其子容器。Wrapper:每一Wrapper封装着一个Servlet。
每个概念层次都通过接口表示,均实现于接口container。其标准实现分别是StandardHost、StandardEngine、EngineContext以及ContextWrapper。
每个层次的容器是通过pipeline实现链条上任务的调用。每个链条上的节点也就是具体的任务是通过阀Value表示的。pipeline是通过ValueContext接口保证其所有阀 & 基础阀 被调用一次。
每个阀选择是否实现contained接口。该接口的实现类可以通过接口中的方法至多跟一个servlet容器相关联。
下面找一个Tomcat的文件目录对照一下,如下图所示:
Context和Host的区别是Context表示一个应用,我们的Tomcat中默认的配置下webapps下的每一个文件夹目录都是一个Context,其中ROOT目录中存放着主应用,其他目录存放着子应用,而整个webapps就是一个Host站点。
我们访问应用Context的时候,如果是ROOT下的则直接使用域名就可以访问,例如:www.ledouit.com,如果是Host(webapps)下的其他应用,则可以使用www.ledouit.com/docs进行访问,当然默认指定的根应用(ROOT)是可以进行设定的,只不过Host站点下默认的主营用是ROOT目录下的。
责任链模式Container处理请求是使用Pipeline-Valve管道来处理的!(Valve是阀门之意)。
Pipeline-Valve使用的责任链模式和普通的责任链模式有些不同!区别主要有以下两点:
每个Pipeline都有特定的Valve,而且是在管道的最后一个执行,这个Valve叫做basevalve,basevalve是不可删除的。在上层容器的管道的basevalve中会调用下层容器的管道。
我们知道Container包含四个子容器,而这四个子容器对应的basevalve分别在:StandardEnginevalve、StandardHostValve、StandardContextValve、StandardWrapperValve。
Pipeline的处理流程图如下(图D):
Connector在接收到请求后会首先调用最顶层容器的Pipeline来处理,这里的最顶层容器的Pipeline就是EnginePipeline(Engine的管道)。在Engine的管道中依次会执行Enginevalve1、Enginevalve2等等,最后会执行StandardEnginevalve,在StandardEnginevalve中会调用Host管道,然后再依次执行Host的HostValve1、HostValve2等,最后在执行StandardHostValve,然后再依次调用Context的管道和Wrapper的管道,最后执行到StandardWrapperValve。当执行到StandardWrapperValve的时候,会在StandardWrapperValve中创建FilterChain,并调用其doFilter方法来处理请求,这个FilterChain包含着我们配置的与请求相匹配的Filter和Servlet,其doFilter方法会依次调用所有的Filter的doFilter方法和Servlet的service方法,这样请求就得到了处理。当所有的Pipeline-Valve都执行完之后,并且处理完了具体的请求,这个时候就可以将返回的结果交给Connector了,Connector在通过Socket的方式将结果返回给客户端。



