- 輕量級(jí)Java EE企業(yè)應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)
- 柳偉衛(wèi)編著
- 1826字
- 2022-07-29 14:31:22
3.10 Tomcat服務(wù)器概述
Apache Tomcat是Java Servlet、JavaServer Pages、Java Expression Language和Java WebSocket技術(shù)的開(kāi)源實(shí)現(xiàn)。Tomcat是在開(kāi)放性和參與性環(huán)境中開(kāi)發(fā)的,并在Apache License版本2下發(fā)布。
Apache Tomcat軟件為各種行業(yè)和組織中的眾多大型、關(guān)鍵任務(wù)Web應(yīng)用程序提供支持。
3.10.1 Tomcat目錄結(jié)構(gòu)
Tomcat目錄結(jié)構(gòu)如下:
- bin:該目錄下存放的是二進(jìn)制可執(zhí)行文件,如果是安裝版,那么這個(gè)目錄下會(huì)有兩個(gè).exe文件:tomcat9.exe和tomcat9w.exe,前者是在控制臺(tái)下啟動(dòng)Tomcat,后者是彈出UGI窗口啟動(dòng)Tomcat;如果是解壓版,那么會(huì)有startup.bat和shutdown.bat文件,startup.bat用來(lái)啟動(dòng)Tomcat,但需要先配置JAVA_HOME環(huán)境變量才能啟動(dòng),shutdown.bat用來(lái)停止Tomcat。
- conf:這是一個(gè)非常重要的目錄,這個(gè)目錄有4個(gè)重要的文件:
server.xml:配置整個(gè)服務(wù)器信息,例如修改端口號(hào)、添加虛擬主機(jī)等。下面將會(huì)詳細(xì)介紹。
tomcatuser.xml:存儲(chǔ)Tomcat用戶的文件,這里保存的是Tomcat的用戶名、密碼以及用戶的角色信息。可以按該文件中的注釋添加Tomcat用戶,然后就可以在Tomcat主頁(yè)中進(jìn)入Tomcat Manager頁(yè)面。
web.xml:部署描述符文件,這個(gè)文件中注冊(cè)了很多MIME類(lèi)型,即文檔類(lèi)型。這些MIME類(lèi)型是客戶端與服務(wù)器之間的說(shuō)明文檔類(lèi)型,如用戶請(qǐng)求一個(gè)HTML網(wǎng)頁(yè),那么服務(wù)器會(huì)告訴客戶端瀏覽器響應(yīng)的文檔是Text/HTML類(lèi)型的,這就是一個(gè)MIME類(lèi)型。客戶端瀏覽器通過(guò)這個(gè)MIME類(lèi)型就知道如何處理它了,當(dāng)然是在瀏覽器中顯示這個(gè)HTML文件。但如果服務(wù)器響應(yīng)的是一個(gè).exe文件,瀏覽器就不可能顯示它,轉(zhuǎn)而會(huì)彈出下載窗口。MIME就是用來(lái)說(shuō)明文檔的內(nèi)容是什么類(lèi)型的。
context.xml:對(duì)所有應(yīng)用的統(tǒng)一配置,通常我們不會(huì)去配置它。
- lib:Tomcat的類(lèi)庫(kù),里面是一大堆JAR文件。如果需要添加Tomcat依賴的JAR文件,那么可以把它放到這個(gè)目錄中,當(dāng)然也可以把應(yīng)用依賴的JAR文件放到這個(gè)目錄中,這個(gè)目錄中的JAR所有項(xiàng)目都可以共享,但這樣你的應(yīng)用放到其他Tomcat下時(shí)就不能共享這個(gè)目錄下的JAR包,所以建議只把Tomcat需要的JAR包放到這個(gè)目錄下。
- logs:這個(gè)目錄中都是日志文件,記錄了Tomcat的啟動(dòng)和關(guān)閉信息,如果啟動(dòng)Tomcat時(shí)有錯(cuò)誤,那么異常也會(huì)記錄在日志文件中。
- temp:存放Tomcat的臨時(shí)文件,這個(gè)目錄下的東西可以在停止Tomcat后刪除。
- webapps:存放Web項(xiàng)目的目錄,其中每個(gè)文件夾都是一個(gè)項(xiàng)目。如果這個(gè)目錄下已經(jīng)存在目錄,那么都是Tomcat自帶的項(xiàng)目。其中ROOT是一個(gè)特殊的項(xiàng)目,在地址欄中沒(méi)有給出項(xiàng)目目錄時(shí),對(duì)應(yīng)的就是ROOT項(xiàng)目。訪問(wèn)http://localhost:8080/hello-servlet,進(jìn)入示例項(xiàng)目。其中hello-servlet就是項(xiàng)目名,即文件夾的名字。
- work:運(yùn)行時(shí)生成的文件,最終運(yùn)行的文件都在這里是通過(guò)webapps中的項(xiàng)目生成的,可以把這個(gè)目錄下的內(nèi)容刪除,再次運(yùn)行時(shí)會(huì)再次生成work目錄。當(dāng)客戶端用戶訪問(wèn)一個(gè)JSP文件時(shí),Tomcat會(huì)通過(guò)JSP生成Java文件,再編譯生成Class文件。生成的Java和Class文件都會(huì)存放到這個(gè)目錄下。
- LICENSE:許可證。
- NOTICE:說(shuō)明文件。
3.10.2 Tomcat主要組件
Tomcat主要組件包括Server、Service、Connector、Container等。Tomcat結(jié)構(gòu)示意圖如圖3-4所示。

圖3-4 Tomcat結(jié)構(gòu)示意圖
- Connector:一個(gè)Connecter將在某個(gè)指定的端口上偵聽(tīng)客戶請(qǐng)求,接收瀏覽器發(fā)過(guò)來(lái)的TCP連接請(qǐng)求,創(chuàng)建一個(gè)Request和Response對(duì)象分別用于和請(qǐng)求端交換數(shù)據(jù),然后會(huì)產(chǎn)生一個(gè)線程來(lái)處理這個(gè)請(qǐng)求并把產(chǎn)生的Request和Response對(duì)象傳給處理Engine,從Engine處獲得響應(yīng)并返回客戶。
- Container:Container是容器的父接口,該容器的設(shè)計(jì)用的是典型的責(zé)任鏈的設(shè)計(jì)模式,它由4個(gè)子容器組件構(gòu)成,分別是Engine、Host、Context、Wrapper。
3.10.3 Tomcat處理HTTP請(qǐng)求的過(guò)程
Tomcat處理HTTP請(qǐng)求的過(guò)程如下:
- 該請(qǐng)求由正在ThreadPoolExecutor類(lèi)中等待的單獨(dú)線程接收。它正在等待常規(guī)ServerSocket.accept()方法中的請(qǐng)求。收到請(qǐng)求后,該線程將被喚醒。
- ThreadPoolExecutor分配一個(gè)TaskThread來(lái)處理請(qǐng)求。它還向catalina容器提供了JMX對(duì)象名稱。
- 在這種情況下,處理請(qǐng)求的處理器是Coyote Http11Processor,并且調(diào)用了處理方法。同一處理器還將繼續(xù)檢查套接字的輸入流,直到達(dá)到保持活動(dòng)點(diǎn)或斷開(kāi)連接為止。
- 使用內(nèi)部緩沖區(qū)類(lèi)(Http11InputBuffer)解析HTTP請(qǐng)求。緩沖區(qū)類(lèi)解析請(qǐng)求行、標(biāo)頭等,并將結(jié)果存儲(chǔ)在Coyote請(qǐng)求(不是HTTP請(qǐng)求)中。此請(qǐng)求包含所有HTTP信息,例如服務(wù)器名、端口、方案等。
- 處理器包含對(duì)適配器的引用。解析請(qǐng)求后,Http11Processor會(huì)在適配器上調(diào)用service()。在服務(wù)方法中,請(qǐng)求包含CoyoteRequest和CoyoteResponse。CoyoteRequest實(shí)現(xiàn)了HttpRequest和HttpServletRequest。適配器通過(guò)Mapper解析所有內(nèi)容并將其與請(qǐng)求、Cookie、上下文相關(guān)聯(lián)。
- 解析完成后,CoyoteAdapter調(diào)用其容器(StandardEngine)并調(diào)用invoke(request,response)方法。這將從引擎級(jí)別開(kāi)始向Catalina容器發(fā)起HTTP請(qǐng)求。
- StandardEngine.invoke()只需調(diào)用容器管道.invoke()。
- 默認(rèn)情況下,引擎只有一個(gè)閥門(mén)StandardEngineValve,該閥門(mén)僅在主機(jī)管道上調(diào)用invoke()方法。
- 默認(rèn)情況下,StandardHost具有兩個(gè)閥門(mén),即StandardHostValve和ErrorReportValve。
- 標(biāo)準(zhǔn)主閥將正確的類(lèi)加載器與當(dāng)前線程相關(guān)聯(lián)。它還會(huì)檢索Manager和與請(qǐng)求關(guān)聯(lián)的會(huì)話(如果有)。如果存在會(huì)話,就調(diào)用access()來(lái)保持會(huì)話有效。
- 之后,StandardHostValve在與請(qǐng)求關(guān)聯(lián)的上下文上調(diào)用管道。
- 上下文管道調(diào)用的第一個(gè)閥是FormAuthenticator閥,然后StandardContextValve被調(diào)用。StandardContextValve調(diào)用與上下文關(guān)聯(lián)的所有上下文偵聽(tīng)器。接下來(lái),它調(diào)用Wrapper組件(StandardWrapperValve)上的管道。
- 在調(diào)用StandardWrapperValve期間,將調(diào)用JSP包裝器,這導(dǎo)致了JSP的實(shí)際編譯,然后調(diào)用實(shí)際的Servlet。
- HTML5+CSS3王者歸來(lái)
- Learning Java Functional Programming
- Monkey Game Development:Beginner's Guide
- Redis入門(mén)指南(第3版)
- Mastering AndEngine Game Development
- C語(yǔ)言程序設(shè)計(jì)
- Monitoring Elasticsearch
- C++ 從入門(mén)到項(xiàng)目實(shí)踐(超值版)
- 大學(xué)計(jì)算機(jī)基礎(chǔ)(第2版)(微課版)
- 高級(jí)語(yǔ)言程序設(shè)計(jì)(C語(yǔ)言版):基于計(jì)算思維能力培養(yǎng)
- 小學(xué)生C++創(chuàng)意編程(視頻教學(xué)版)
- Advanced Oracle PL/SQL Developer's Guide(Second Edition)
- 劍指Java:核心原理與應(yīng)用實(shí)踐
- 組態(tài)軟件技術(shù)與應(yīng)用
- 21天學(xué)通C++(第5版)