Tomcat即是一个HTTP服务器,也是一个servlet容器,主要目的就是包装servlet,并对请求响应相应的servlet,纯servlet的web应用似乎很好理解Tomcat是如何装载servlet的,但,当使用一些MVC框架时,如spring MVC、strusts2,可能就找不出servlet在哪里?其实spring MVC框架就是一整个servlet,在web.xml中配置如下:
SpringMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
true
SpringMVC
/
而Struts2是基于过滤器的(过滤器也称作阀门,过滤器链相当于流水线),过滤器执行在调用servlet的service()方法之前。在web.xml的配置如下:
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
他的总体结构用下图来表示。
通过上图我们可以看出Tomcat中主要涉及Server,Service,Engine,Connector,Host,Context组件,之前用过Tomcat的童鞋是不是觉得这些组件的名称有点似曾相识的赶脚,没赶脚?!您再想想。好吧,不用你想了,我来告诉你吧。其实在Tomcat二进制分发包解压后,在conf目录中有一个server.xml文件,你打开它瞄两眼看看,是不是发现server.xml文件中已经包含了上述的几个名称。
Lifecycle是Tomcat的生命周期接口。保持组件启动和停止一致的的机制通过实现org.apache.catalina.Lifecycle接口来实现。
Catalina
的服务,并将Http,AJP(定向包的协议)这两个Connector关联到了一个名为
Catalina
的Service,注意一个Connetor对应处理一种协议。Service组件对应Tomcat源代码中的
org.apache.catalina.core.StandardService
,StandardService的继承关系图如下图所示:
既然Tomcat需要提供http服务,而我们知道http应用层协议最终都是需要通过TCP层的协议进行传递的,而Connector正是Tomcat中监听TCP网络连接的组件,一个Connector会监听一个独立的端口来处理来自客户端的连接。缺省的情况下Tomcat提供了如下两个Connector。我们分别描述一下:
上面定义了一个Connector,它缺省监听端口8080,这个端口我们可以根据具体情况进行改动。connectionTimeout
定义了连接超时时间,单位是毫秒,redirectPort
定义了ssl的重定向接口,根据缺省的配置,Connector会将ssl请求重定向到8443端口。Apache Jserv Protocol
,此连接器将处理Tomcat和Aapache http服务器之间的交互,这个连接器是用来处理我们将Tomcat和Apache http服务器结合使用的情况。假如在同样的一台物理Server上面部署了一台Apache http服务器和多台Tomcat服务器,通过Apache服务器来处理静态资源以及负载均衡的时候,针对不同的Tomcat实例需要AJP监听不同的端口。org.apache.catalina.connector.Connector
,它的继承关系图如下所示:
Tomcat中有一个容器的概念,而Engine,Host,Context都属于Contanier,我们先来说说最顶层的容器Engine.
一个Engine可以包含一个或者多个Host,也就是说我们一个Tomcat的实例可以配置多个虚拟主机。
缺省的情况下
定义了一个名称为Cataline的Engine.Engine对应源代码中的org.apache.catalina.core.StandardEngine
,它的继承关系图如下图所示:
Host定义了一个虚拟主机,一个虚拟主机可以有多个Context,缺省的配置如下:
其中appBase
为webapps,也就是
目录,unpackingWARS
属性指定在appBase指定的目录中的war包都自动的解压,缺省配置为true,autoDeploy
属性指定是否对加入到appBase目录的war包进行自动的部署,缺省为true.
Host对应源代码中的org.apache.catalina.core.StandardHost
,它的继承关系图如下所示:
在Tomcat中,每一个运行的webapp其实最终都是以Context的形成存在,每个Context都有一个根路径和请求URL路径,Context对应源代码中的org.apache.catalina.core.StandardContext
,它的继承关系图如下图所示:
在Tomcat中我们通常采用如下的两种方式创建一个Context.下面分别描述一下:
\webapps
目录中创建一个目录,这个时候将自动创建一个context,默认context的访问url为http://host:port/dirname
,你也可以通过在ContextRoot\META-INF
中创建一个context.xml的文件,其中包含如下的内容来指定应用的访问路径。
元素,比如我们在server.xml文件中增加如下内容: .......
.........
这样的话,我们就可以通过
http://host:port/mypath
访问上面配置的context了。
Valve中文意思是阀门,Valve是Tomcat中责任链模式的实现,通过链接多个Valve对请求进行处理。每个容器都有一个流水线Pipeline(过滤器链),每个流水线至少有一个阀门。其中Valve可以定义在任何的Container中,上面说的Engine,Host,Context都属于容器。tomcat 默认定义了一个名为org.apache.catalina.valves.AccessLogValve
的Valve,这个Valve负责拦截每个请求,然后记录一条访问日志。
通过上面的分析,我们发现Server,Service,Engine,Host,Context都实现了org.apache.catalina.Lifecycle
接口,通过这个接口管理了这些核心组件的生命周期,关于这些组件的生命周期,我们在下一篇文章描述。