首先我们得看看Tomcat的基本元素,各个版本中相似但不同,在Tomcat中的server.xml中描述了以下的元素:
@ server:顶层元素,代表整个Catalina Servlet容器,可以包含一个或者是多个Service;
@ Service:连接器元素,它由一个或者多个Connector和一个Engine组成,负责处理所有的Connector所获得的客户请求。这些 Connector共享一个Engine。
@Connector: 一个Connector将在某个指定端口上侦听客户请求,并且将获得的请求交给Engine来处理,再从Engine上或的回 应然后返回给客户端。
@Engine: 容器类元素,可以包含多个Virtual Host元素,每个虚拟主机都有一个域名,当Engine获得一个Connector发出的 HTTP请求时,它吧请求匹配到某个Host上,然后把该请求交给该Host来处理,Engine有一个默认的虚拟主机 Localhost。当请求无法匹配到任何一个Host来处理,将交给默认的Host来处理。
@Host: 定义一个虚拟主机,每个虚拟主机都和某个DNS相匹配,每个虚拟主机下都可以部署多个web应用程序。当Host获得一 个请求时,将该请求匹配到某个Context上,然后将该请求交给该Context处理。所有无法与Context匹配的都与path=“”的默认Context匹配。
@Context: Context代表一个虚拟主机上运行的一个应用,一个Context对应一个web应用程序,一个Context包含多Servlet。
下面我们来看一下Tomcat Server的关系图:
下面我们来看一下一个请求的过程:(假设请求为:http://localhost:8080/test/index.jsp)
1. 请求被发送到本机端口8080,被在哪里侦听的HTTP Connector获得;
2. Connector把请求交给他所在的Service的Engine来处理,等待来自Engine的回应;
3.Engine获得请求localhost:8080/test/index.jsp并且匹配她所拥有的虚拟主机Host;
4.Engine匹配到Localhost主机,如果匹配不到的话,就匹配默认主机;
5.Host匹配到路径为“/test”的Context,如果匹配不到就交给默认的Context处理;
6.path = “/test”的Context获得请求/index.jsp,在他的mapping table中寻找对应的Servlet
7.Context匹配到URL为*.jsp的Servlet,对应于JspSevlet类;
8.HttpServletRequest对象和HttpServletResponse对象作为参数调用JspSevlet中的doPost和doGet方法;
9.Context将执行完的HttpServletResponse对象返回给Host;
10.Host将执行完的HttpServletResponse对象返回给Engine;
11.Engine将执行完的HttpServletResponse对象返回给Connector;
12.Connector将执行完的HttpServletResponse对象返回给客户端;