Tomcat一

Tomcat是如何处理http请求的

Tomcat有什么用?

Tomcat是一个应用服务器,也是一个Servlet容器,用来接收前端传过来的请求,并将请求传给Servlet,并将Servlet的响应返回给客户端。

Tomcat的体系结构

Tomcat的两大核心组件:Connector和Container

Connector负责在服务器端处理客户端的连接,接受客户端的消息报文以及消息报文的解析工作,并把解析后的内容发送给Container;而Container组件负责对客户端的请求进行逻辑处理,并把结果返回给客户端。

1、Connector

一个Connector组件负责监听某个端口的客户请求,接受来自客户的TCP连接请求,并创建一个request和一个response对象,然后产生一个线程来处理这个请求并把产生的Request和Response对象传给Engine组件,从Engine获取返回结果并返回给客户端。
Tomcat中的两个Connector
一个用于监听来自浏览器的请求,另一个用于监听来自其他webServer的请求。
Coyote HTTP/1.1 Connector用来监听8080端口来自客户端的请求;
Coyote JK2 Connector用来监听8009端口来自其他WebServer的请求。
Connector的作用
Connector的最重要的功能就是接收连接请求,创建Request和Response对象,并且分配线程让Container来处理请求,所以必然是多线程的,多线程是Connector的设计核心。

2、Container组件


Container是容器的父接口,它是由Engine,Host,Context,Wrapper组成。通常也给Servlet对应一个Wrapper,多个Servlet则需定义多个Wrapper,如果有多个Wrapper则需要定义Context容器,Context则必须定义在Host中,Host不是必须的,但如果要运行War包,则必须要Host,因为web.xml需要Host解析,如果有多个Host就需要定义更高一级的容器Engine。
Engine
简单的定义Host容器。
Host
Host是Engine的子容器,一个Host在Engine中代表一个虚拟主机,它的作用就是运行多个应用。
Context
Context是Servlet的Context,它用来管理Servlet实例,
Wrapper
Wrapper代表一个Servlet,它负责管理Servlet,包括Servlet的装载,初始化,执行,以及卸载。它是最底层的容器。

Tomcat处理一个HTTP请求的过程


(1)Tomcat启动后,Connector组件的接收器(Acceptor)将会监听是否有客户端连接
(2)监听到客户端连接,将连接交给连接池Executor处理,开始执行请求响应任务。
(3)HttpIIProcessor组件负责从客户端连接中读取消息报文,然后解析HTTP的请求行,然后调用Adapter.service()方法解析请求头和请求体。将解析后的报文组装成Request对象。org.apache.catalina.connector.CoyoteAdapter是Connector和Container的桥梁,调用Adapter.service()方法之后便将封装了Request和Response传递给Container了。
(4)Engine容器处理请求调用了StandardEngineValve的invoke方法,选择合适的Host处理请求。
(5)调用Host的invoke方法,根据URL选择出一个Context容器
(6)调用Wrapper容器的invoke方法,把处理请求交给StandardWrapperValve处理。
假设来自客户的请求为:
http://localhost:8080/wsota/wsota_index.jsp

  1. 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得
  2. Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应
  3. Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host
  4. Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)
  5. localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context
  6. Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为””的Context去处理)
  7. path=”/wsota”的Context获得请求/wsota_index.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
    引用:https://blog.csdn.net/sky_100/article/details/77541968

posted on 2019-03-29 19:51  红绿森林  阅读(112)  评论(0编辑  收藏  举报