久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

怎樣解析Tomcat內部結構和請求過程

213次閱讀
沒有評論

共計 3266 個字符,預計需要花費 9 分鐘才能閱讀完成。

怎樣解析 Tomcat 內部結構和請求過程,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

概述

Tomcat 是一個 JSP/Servlet 容器。其作為 Servlet 容器,有三種工作模式:獨立的 Servlet 容器、進程內的 Servlet 容器和進程外的 Servlet 容器。

Tomcat 的組織結構

Tomcat 是一個基于組件的服務器,它的構成組件都是可配置的,其中最外層的是 Catalina  servlet 容器,其他組件按照一定的格式要求配置在這個頂層容器中。

Tomcat 的各種組件都是在 Tomcat 安裝目錄下的 /conf/server.xml 文件中配置的。

由 Server.xml 的結構看 Tomcat 的體系結構

由上可得出 Tomcat 的體系結構:

Tomcat 的體系結構

由上圖可看出 Tomca 的心臟是兩個組件:Connecter 和 Container。一個 Container 可以選擇多個 Connecter,多個 Connector 和一個 Container 就形成了一個 Service。Service 可以對外提供服務,而 Server 服務器控制整個 Tomcat 的生命周期。

組件的生命線“Lifecycle”

Service 和 Server 管理它下面組件的生命周期。

Tomcat 中組件的生命周期是通過 Lifecycle   接口來控制的,組件只要繼承這個接口并實現其中的方法就可以統一被擁有它的組件控制了,這樣一層一層的直到一個最高級的組件就可以控制 Tomcat   中所有組件的生命周期,這個最高的組件就是 Server,而控制 Server 的是 Startup,也就是您啟動和關閉 Tomcat。

Tomca 的兩大組件:Connecter 和 Container

Connecter 組件

一個 Connecter 將在某個指定的端口上偵聽客戶請求,接收瀏覽器的發過來的 tcp 連接請求,創建一個 Request 和 Response   對象分別用于和請求端交換數據,然后會產生一個線程來處理這個請求并把產生的 Request 和 Response   對象傳給處理 Engine(Container 中的一部分),從 Engine 出獲得響應并返回客戶。

Tomcat 中有兩個經典的 Connector,一個直接偵聽來自 Browser 的 HTTP 請求,另外一個來自其他的 WebServer 請求。Cotote  HTTP/1.1 Connector 在端口 8080 處偵聽來自客戶 Browser 的 HTTP 請求,Coyote JK2  Connector 在端口 8009 處偵聽其他 Web Server 的 Servlet/JSP 請求。

Connector 最重要的功能就是接收連接請求然后分配線程讓 Container 來處理這個請求,所以這必然是多線程的,多線程的處理是  Connector 設計的核心。

Container 組件

Container 的體系結構如下:

Container 的體系結構

Container 是容器的父接口,該容器的設計用的是典型的責任鏈的設計模式,它由四個自容器組件構成,分別是 Engine、Host、Context、Wrapper。這四個組件是負責關系,存在包含關系。通常一個 Servlet  class 對應一個 Wrapper,如果有多個 Servlet 定義多個 Wrapper,如果有多個 Wrapper 就要定義一個更高的 Container,如 Context。

Context 還可以定義在父容器 Host 中,Host 不是必須的,但是要運行 war 程序,就必須要 Host,因為 war 中必有 web.xml   文件,這個文件的解析就需要 Host 了,如果要有多個 Host 就要定義一個 top 容器 Engine 了。而 Engine 沒有父容器了,一個  Engine 代表一個完整的 Servlet 引擎。

Engine 容器

Engine 容器比較簡單,它只定義了一些基本的關聯關系

Host 容器

Host 是 Engine 的字容器,一個 Host 在 Engine   中代表一個虛擬主機,這個虛擬主機的作用就是運行多個應用,它負責安裝和展開這些應用,并且標識這個應用以便能夠區分它們。它的子容器通常是  Context,它除了關聯子容器外,還有就是保存一個主機應該有的信息。

Context 容器

Context 代表 Servlet 的 Context,它具備了 Servlet 運行的基本環境,理論上只要有 Context 就能運行 Servlet   了。簡單的 Tomcat 可以沒有 Engine 和 Host。Context 最重要的功能就是管理它里面的 Servlet 實例,Servlet 實例在  Context 中是以 Wrapper 出現的,還有一點就是 Context 如何才能找到正確的 Servlet 來執行它呢? Tomcat5 以前是通過一個  Mapper 類來管理的,Tomcat5 以后這個功能被移到了 request 中,在前面的時序圖中就可以發現獲取子容器都是通過 request   來分配的。

Wrapper 容器

Wrapper 代表一個 Servlet,它負責管理一個 Servlet,包括的 Servlet 的裝載、初始化、執行以及資源回收。Wrapper   是最底層的容器,它沒有子容器了,所以調用它的 addChild 將會報錯。

Wrapper 的實現類是 StandardWrapper,StandardWrapper 還實現了擁有一個 Servlet 初始化信息的  ServletConfig,由此看出 StandardWrapper 將直接和 Servlet 的各種信息打交道。

Tomcat 中其它組件

Tomcat 還有其它重要的組件,如安全組件 security、logger 日志組件、session、mbeans、naming   等其它組件。這些組件共同為 Connector 和 Container 提供必要的服務。

Tomcat Server 處理一個 HTTP 請求的過程

Tomcat Server 處理一個 HTTP 請求的過程

Tomcat Server 處理一個 HTTP 請求的過程

1、用戶點擊網頁內容,請求被發送到本機端口 8080,被在那里監聽的 Coyote HTTP/1.1 Connector 獲得。

2、Connector 把該請求交給它所在的 Service 的 Engine 來處理,并等待 Engine 的回應。

3、Engine 獲得請求 localhost/test/index.jsp,匹配所有的虛擬主機 Host。

4、Engine 匹配到名為 localhost 的 Host(即使匹配不到也把請求交給該 Host 處理,因為該 Host 被定義為該 Engine 的默認主機),名為 localhost 的 Host 獲得請求 /test/index.jsp,匹配它所擁有的所有的 Context。Host 匹配到路徑為 /test 的 Context(如果匹配不到就把該請求交給路徑名為“ ”的 Context 去處理)。

5、path=“/test”的 Context 獲得請求 /index.jsp,在它的 mapping  table 中尋找出對應的 Servlet。Context 匹配到 URL PATTERN 為 *.jsp 的 Servlet, 對應于 JspServlet 類。

6、構造 HttpServletRequest 對象和 HttpServletResponse 對象,作為參數調用 JspServlet 的 doGet() 或 doPost(). 執行業務邏輯、數據存儲等程序。

7、Context 把執行完之后的 HttpServletResponse 對象返回給 Host。

8、Host 把 HttpServletResponse 對象返回給 Engine。

9、Engine 把 HttpServletResponse 對象返回 Connector。

10、Connector 把 HttpServletResponse 對象返回給客戶 Browser。

關于怎樣解析 Tomcat 內部結構和請求過程問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注丸趣 TV 行業資訊頻道了解更多相關知識。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計3266字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 南陵县| 蒲城县| 板桥市| 富顺县| 万州区| 延边| 宽甸| 泾阳县| 景德镇市| 泽州县| 师宗县| 年辖:市辖区| 辉县市| 志丹县| 泗水县| 南和县| 海安县| 屏山县| 威远县| 曲水县| 长武县| 乐业县| 西乌珠穆沁旗| 荥经县| 新营市| 威信县| 东城区| 津南区| 镇沅| 东辽县| 德兴市| 华宁县| 台南县| 南汇区| 辉县市| 宣城市| 阿拉善右旗| 鲁山县| 方山县| 榆林市| 涟水县|