Tomcat 原理篇

时间:2021-10-11 16:31:20

TOMCAT 原理篇
一、Tomcat 组成(Tomcat 由以下组件组成)
1.server
a) Server是一个Catalina Servlet容器;
b) Server 可以包含一个或多个service组件(元素)

2.service
a) server 包含了一个engine组件以及一个或多个connector组件;
b) server 中可以配置多个service:
1. 第一个service处理所有Tomcat服务器接收到的web客户端请求;
2. 第二个service处理由Apache服务器转发过来的web客户端请求(SSL);

3.connector
a) connector 属于连接类组件;
b) connector 介于客户端和服务器之间的通信接口,负责将客户端的请求转发给服务器,并将服务器的响应结果传递给客户;

4.engine
a) engine 引擎属于容器类组件;
b) 容器类组件主要是处理客户请求并生成相应的响应结果;
c) engine 容器组件为特定的service组件处理所有的客户请求;

5.host
a) host 虚拟主机组件为特定的虚拟主机处理所有的客户请求;

6.context
a) context 上下文组件为特定的web应用处理所有的客户请求;

二、Tomcat 结构目录说明(假设开发一个名为API的tomcat工程,即<CATALINA_HOME>/webapps/API)
1./API : #WEB应用的根目录,所有的JSP和HTML文件都放在此目录下;
2./API/WEB-INF: #存放web应用的发布描述文件web.xml
3./API/WEB-INF/class: #存放各种class文件,servlet类文件也放在此目录下
4./API/WEB-INF-lib: #存放web应用所需的各种JAR文件

三、Tomcat 配置文件中各个元素说明
1.各个元素的结构关系
<server>
  <service>
    <connector>
    <engine>
      <host>
        <context>
        <context>
      </host>
    </engine>
    </connector>
  </service>
</server>
2.各个元素说明
a) server、service 都属于顶层元素或组件
b) connector 属于连接元素,介于客户和服务器之间的通信接口,负载将客户的请求发送给服务器,并将服务器的响应结果传递给客户;
c) engine、Host、context 等都属于容器元素,主要处理客户请求并生成相应结果的组件;
d) engine 容器元素为特定的service组件处理所有的客户请求;
e) Host 容器元素为特定的虚拟主机处理所有的客户请求;
f) context 容器元素组件为特定的web应用处理所有的客户请求;

四、工作原理
综合以上说明,分析Tomcat Server处理一个http请求的过程来印证工作原理
假设来自客户的请求为:http://localhost:8080/API/notice.jsp

1.当客户发送如上所示的请求时,请求被发送到端口8080,被在那里侦听的connector获得;
2.connector 把该请求交给它所在的service的engine来处理,并等待engine的回应;
3.engine 获得请求localhost/API/notice.jsp,匹配它所拥有的所有虚拟主机Host;
4.engine 匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该host被定义为该engine的默认主机);
5.localhost Host 获得请求/API/notice.jsp,匹配它所拥有的所有Context;
6.Host 匹配到路径为/API的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)
7.path="/API"的context获得请求notice.jsp,在它的mapping table中寻找对应的servlet;
8.context 匹配到URL PATTERN为 *.jsp的servlet,对应于JspServlet类;
9.构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法;
10.Context 把执行完了之后的HttpServletResponse对象返回给Host
11.Host 把HttpServletResponse对象返回给Engine
12.Engine 把HttpServletResponse对象返回给Connector
13.Connector把HttpServletResponse对象返回给客户browser