怎樣解析Tomcat內(nèi)部結(jié)構(gòu)和請(qǐng)求過程,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。
為三明等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及三明網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、三明網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
概述
Tomcat是一個(gè)JSP/Servlet容器。其作為Servlet容器,有三種工作模式:獨(dú)立的Servlet容器、進(jìn)程內(nèi)的Servlet容器和進(jìn)程外的Servlet容器。
Tomcat的組織結(jié)構(gòu)
Tomcat是一個(gè)基于組件的服務(wù)器,它的構(gòu)成組件都是可配置的,其中最外層的是Catalina servlet容器,其他組件按照一定的格式要求配置在這個(gè)頂層容器中。
Tomcat的各種組件都是在Tomcat安裝目錄下的/conf/server.xml文件中配置的。
由Server.xml的結(jié)構(gòu)看Tomcat的體系結(jié)構(gòu)
由上可得出Tomcat的體系結(jié)構(gòu):
Tomcat的體系結(jié)構(gòu)
由上圖可看出Tomca的心臟是兩個(gè)組件:Connecter和Container。一個(gè)Container可以選擇多個(gè)Connecter,多個(gè)Connector和一個(gè)Container就形成了一個(gè)Service。Service可以對(duì)外提供服務(wù),而Server服務(wù)器控制整個(gè)Tomcat的生命周期。
組件的生命線“Lifecycle”
Service 和 Server 管理它下面組件的生命周期。
Tomcat 中組件的生命周期是通過 Lifecycle 接口來控制的,組件只要繼承這個(gè)接口并實(shí)現(xiàn)其中的方法就可以統(tǒng)一被擁有它的組件控制了,這樣一層一層的直到一個(gè)最高級(jí)的組件就可以控制 Tomcat 中所有組件的生命周期,這個(gè)最高的組件就是 Server,而控制 Server 的是 Startup,也就是您啟動(dòng)和關(guān)閉 Tomcat。
Tomca的兩大組件:Connecter和Container
Connecter組件
一個(gè)Connecter將在某個(gè)指定的端口上偵聽客戶請(qǐng)求,接收瀏覽器的發(fā)過來的 tcp 連接請(qǐng)求,創(chuàng)建一個(gè) Request 和 Response 對(duì)象分別用于和請(qǐng)求端交換數(shù)據(jù),然后會(huì)產(chǎn)生一個(gè)線程來處理這個(gè)請(qǐng)求并把產(chǎn)生的 Request 和 Response 對(duì)象傳給處理Engine(Container中的一部分),從Engine出獲得響應(yīng)并返回客戶。
Tomcat中有兩個(gè)經(jīng)典的Connector,一個(gè)直接偵聽來自Browser的HTTP請(qǐng)求,另外一個(gè)來自其他的WebServer請(qǐng)求。Cotote HTTP/1.1 Connector在端口8080處偵聽來自客戶Browser的HTTP請(qǐng)求,Coyote JK2 Connector在端口8009處偵聽其他Web Server的Servlet/JSP請(qǐng)求。
Connector 最重要的功能就是接收連接請(qǐng)求然后分配線程讓 Container 來處理這個(gè)請(qǐng)求,所以這必然是多線程的,多線程的處理是 Connector 設(shè)計(jì)的核心。
Container組件
Container的體系結(jié)構(gòu)如下:
Container的體系結(jié)構(gòu)
Container是容器的父接口,該容器的設(shè)計(jì)用的是典型的責(zé)任鏈的設(shè)計(jì)模式,它由四個(gè)自容器組件構(gòu)成,分別是Engine、Host、Context、Wrapper。這四個(gè)組件是負(fù)責(zé)關(guān)系,存在包含關(guān)系。通常一個(gè)Servlet class對(duì)應(yīng)一個(gè)Wrapper,如果有多個(gè)Servlet定義多個(gè)Wrapper,如果有多個(gè)Wrapper就要定義一個(gè)更高的Container,如Context。
Context 還可以定義在父容器 Host 中,Host 不是必須的,但是要運(yùn)行 war 程序,就必須要 Host,因?yàn)?war 中必有 web.xml 文件,這個(gè)文件的解析就需要 Host 了,如果要有多個(gè) Host 就要定義一個(gè) top 容器 Engine 了。而 Engine 沒有父容器了,一個(gè) Engine 代表一個(gè)完整的 Servlet 引擎。
Engine 容器
Engine 容器比較簡(jiǎn)單,它只定義了一些基本的關(guān)聯(lián)關(guān)系
Host 容器
Host 是 Engine 的字容器,一個(gè) Host 在 Engine 中代表一個(gè)虛擬主機(jī),這個(gè)虛擬主機(jī)的作用就是運(yùn)行多個(gè)應(yīng)用,它負(fù)責(zé)安裝和展開這些應(yīng)用,并且標(biāo)識(shí)這個(gè)應(yīng)用以便能夠區(qū)分它們。它的子容器通常是 Context,它除了關(guān)聯(lián)子容器外,還有就是保存一個(gè)主機(jī)應(yīng)該有的信息。
Context 容器
Context 代表 Servlet 的 Context,它具備了 Servlet 運(yùn)行的基本環(huán)境,理論上只要有 Context 就能運(yùn)行 Servlet 了。簡(jiǎn)單的 Tomcat 可以沒有 Engine 和 Host。Context 最重要的功能就是管理它里面的 Servlet 實(shí)例,Servlet 實(shí)例在 Context 中是以 Wrapper 出現(xiàn)的,還有一點(diǎn)就是 Context 如何才能找到正確的 Servlet 來執(zhí)行它呢? Tomcat5 以前是通過一個(gè) Mapper 類來管理的,Tomcat5 以后這個(gè)功能被移到了 request 中,在前面的時(shí)序圖中就可以發(fā)現(xiàn)獲取子容器都是通過 request 來分配的。
Wrapper 容器
Wrapper 代表一個(gè) Servlet,它負(fù)責(zé)管理一個(gè) Servlet,包括的 Servlet 的裝載、初始化、執(zhí)行以及資源回收。Wrapper 是最底層的容器,它沒有子容器了,所以調(diào)用它的 addChild 將會(huì)報(bào)錯(cuò)。
Wrapper 的實(shí)現(xiàn)類是 StandardWrapper,StandardWrapper 還實(shí)現(xiàn)了擁有一個(gè) Servlet 初始化信息的 ServletConfig,由此看出 StandardWrapper 將直接和 Servlet 的各種信息打交道。
Tomcat 中其它組件
Tomcat 還有其它重要的組件,如安全組件 security、logger 日志組件、session、mbeans、naming 等其它組件。這些組件共同為 Connector 和 Container 提供必要的服務(wù)。
Tomcat Server處理一個(gè)HTTP請(qǐng)求的過程
Tomcat Server處理一個(gè)HTTP請(qǐng)求的過程
Tomcat Server處理一個(gè)HTTP請(qǐng)求的過程
1、用戶點(diǎn)擊網(wǎng)頁內(nèi)容,請(qǐng)求被發(fā)送到本機(jī)端口8080,被在那里監(jiān)聽的Coyote HTTP/1.1 Connector獲得。
2、Connector把該請(qǐng)求交給它所在的Service的Engine來處理,并等待Engine的回應(yīng)。
3、Engine獲得請(qǐng)求localhost/test/index.jsp,匹配所有的虛擬主機(jī)Host。
4、Engine匹配到名為localhost的Host(即使匹配不到也把請(qǐng)求交給該Host處理,因?yàn)樵揌ost被定義為該Engine的默認(rèn)主機(jī)),名為localhost的Host獲得請(qǐng)求/test/index.jsp,匹配它所擁有的所有的Context。Host匹配到路徑為/test的Context(如果匹配不到就把該請(qǐng)求交給路徑名為“ ”的Context去處理)。
5、path=“/test”的Context獲得請(qǐng)求/index.jsp,在它的mapping table中尋找出對(duì)應(yīng)的Servlet。Context匹配到URL PATTERN為*.jsp的Servlet,對(duì)應(yīng)于JspServlet類。
6、構(gòu)造HttpServletRequest對(duì)象和HttpServletResponse對(duì)象,作為參數(shù)調(diào)用JspServlet的doGet()或doPost().執(zhí)行業(yè)務(wù)邏輯、數(shù)據(jù)存儲(chǔ)等程序。
7、Context把執(zhí)行完之后的HttpServletResponse對(duì)象返回給Host。
8、Host把HttpServletResponse對(duì)象返回給Engine。
9、Engine把HttpServletResponse對(duì)象返回Connector。
10、Connector把HttpServletResponse對(duì)象返回給客戶Browser。
關(guān)于怎樣解析Tomcat內(nèi)部結(jié)構(gòu)和請(qǐng)求過程問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
分享文章:怎樣解析Tomcat內(nèi)部結(jié)構(gòu)和請(qǐng)求過程
轉(zhuǎn)載注明:http://aaarwkj.com/article48/gjdchp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、網(wǎng)站策劃、服務(wù)器托管、ChatGPT、微信小程序、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)