Tomcat处理一个HTTP请求的过程
(1)Server
服務器元素代表整個catalina servlet容器。是單例模式。
?
(2)Service
Service是這樣一個集合:它由一個或者多個Connector組成,以及一個Engine,負責處理所有Connector所獲得的客戶請求。
?
(3)Connector
一個Connector將在某個指定端口上偵聽客戶請求,并將獲得的請求交給Engine來處理,從Engine處獲得回應并返回客戶。TOMCAT有兩個典型的Connector,一個直接偵聽來自browser的http請求,一個偵聽來自其它WebServer的請求
Coyote Http/1.1 Connector 在端口8080處偵聽來自客戶browser的http請求
Coyote JK2 Connector 在端口8009處偵聽來自其它WebServer(Apache)的servlet/jsp代理請求
?
(4) Engine
Engine下可以配置多個虛擬主機Virtual Host,每個虛擬主機都有一個域名,當Engine獲得一個請求時,它把該請求匹配到某個Host上,然后把該請求交給該Host來處理,Engine有一個默認虛擬主機,當請求無法匹配到任何一個Host上的時候,將交給該默認Host來處理
?
(5)Host
代表一個Virtual Host,虛擬主機,每個虛擬主機和某個網絡域名Domain Name相匹配,每個虛擬主機下都可以部署(deploy)一個或者多個Web App,每個Web App對應于一個Context,有一個Context path,當Host獲得一個請求時,將把該請求匹配到某個Context上,然后把該請求交給該Context來處理,匹配的方法是“最長匹配”,所以一個path==""的Context將成為該Host的默認Context,所有無法和其它Context的路徑名匹配的請求都將最終和該默認Context匹配
?
(6)Context
一個Context對應于一個Web Application,一個Web Application由一個或者多個Servlet組成,Context在創建的時候將根據配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml載入Servlet類,當Context獲得請求時,將在自己的映射表(mapping table)中尋找相匹配的Servlet類,如果找到,則執行該類,獲得請求的回應,并返回。
?
二、Tomcat的http請求處理
(1)browser 請求url被發送到本機端口默認為80,被在那里偵聽的Coyote HTTP/1.1 Connector獲得?
(2) Connector把該請求交給它所在的Service的Engine來處理,并等待來自Engine的回應?
(3) Engine獲得請求url,匹配它所擁有的所有虛擬主機Host?
(4) Engine匹配到名為severName的Host(即使匹配不到也把請求交給localhost Host處理,因為該Host被定義為該Engine的默認主機)?
(5) Host獲得請求url,匹配它所擁有的所有Context?
(6) Host匹配到路徑前綴相同的Context(如果匹配不到就把該請求交給路徑名為”“的Context去處理)?
(7)Context獲得請求url,在它的mapping table中尋找對應的servlet?
(8) Context匹配到URL PATTERN為*.jsp的servlet,對應于JspServlet類?
(9) 構造HttpServletRequest對象和HttpServletResponse對象,作為參數調用Servlet的doGet或doPost方法?
(10)Context把執行完了之后的HttpServletResponse對象返回給Host?
(11)Host把HttpServletResponse對象返回給Engine?
(12)Engine把HttpServletResponse對象返回給Connector?
(13)Connector把HttpServletResponse對象返回給客戶browser
?
三、tomcat處理一個請求的詳細流程
protocolHandler負責生成endpoint和Http11ConnectionHandler,endpoint的acceptor線程負責處理連接請求,收到連接請求后交給worker線程處理。work線程調用Http11ConnectionHandler,Http11ConnectionHandler維護一個Http11Processor池,在構造Http11Processor時將生成org.apache.coyote.Request和org.apache.coyote.Response對象。
Http11Processor使用InternalInputBuffer類來解析http協議,并將解析后的數據(請求頭,分割行等)封裝到org.apache.coyote.Request和org.apache.coyote.Response對象中,之后將此兩對象傳給CoyoteAdapter.service(request, response)在該方法內部實現了org.apache.coyote.Request --> org.apache.catalina.connector.Request,
org.apache.coyote.Response --> org.apache.catalina.connector.Response的轉換。
接下來請求進入pipeline,pipeline中value的執行(調用value的invoke方法)順序如下:?
StandardEngineValve --> StandardHostValve --> StandardContextValve --> StandardWrapperValve --> ApplicationFilterChain.doFilter --> Servlet(HttpServlet).service?
(由StandardWrapper創建的單實例——多線程共用),invoke方法的參數即為org.apache.catalina.connector.Request/Response。?
如果是jsp則繼續-->JspServletWrapper.service-->Compiler(如果沒有被編譯的話) --> 裝載具體編譯后的servlet class file-->交給具體servlet的service方法 --> 通過out.write寫入html頁面,事實上這個out是response.getWriter,所以也就將結果寫入了response。?
總結
以上是生活随笔為你收集整理的Tomcat处理一个HTTP请求的过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国内首艘氢燃料电池动力示范船“三峡氢舟
- 下一篇: 笔记本电脑显示卡怎么查看?