Tomcat-結構原理

客戶端用戶點擊瀏覽器服務連接,瀏覽器通過客戶端底層服務通過路由傳送報文,目標服務器獲取解析報文,Tomcat監聽程序觸發處理請求

一、Tomcat 軟件目錄結構及功能

  1. bin: 服務相關腳本,例如:啟動、關閉等

  2. conf: 存放不同的配置文件,列如:server.xml、web.xml

  3. lib: tomcat 運行需要的庫文件

  4. logs: 運行的日誌文件

  5. webapps: web部署的根目錄

  6. work :存放jsp編譯後的class文件

二、server分析系統結構

  1. server

    提供一個接口讓其它程序能夠訪問到這個 Service 集合、同時要維護它所包含的所有 Service 的生命週期,包括如何初始化、如何結束服務、如何找到別人要訪問的 Service

  2. service

    service 是server下一個集合,service包含多個接收請求的connector並有一個處理所有連接的容器container

  3. connector

    connector 作用是監聽客戶端請求,並將請求封裝提交container處理,然後將處理結果返回客戶端

    tomcat有兩個典型的connector,一個用來監聽瀏覽器的http,另一個是用來監聽webservice

    Coyote Http/1.1 Connector 在端口8080處偵聽來自客戶browser的http請求

    Coyote AJP/1.3 Connector 在端口8009處偵聽來自其它WebServer(Apache)的servlet/jsp代理請求

  4. container

    4.1 Engine

    Engine下可以配置多個虛擬主機Virtual Host,每個虛擬主機都有一個域名

    當Engine獲得一個請求時,它把該請求匹配到某個Host上,然後把該請求交給該Host來處理

    Engine有一個默認虛擬主機,當請求無法匹配到任何一個Host上的時候,將交給該默認Host來處理

    4.2 Host

    代表一個Virtual Host,虛擬主機,每個虛擬主機和某個網絡域名Domain Name相匹配

    每個虛擬主機下都可以部署(deploy)一個或者多個Web App,每個Web App對應於一個Context,有一個Context path

    當Host獲得一個請求時,將把該請求匹配到某個Context上,然後把該請求交給該Context來處理

    匹配的方法是“最長匹配”,所以一個path==""的Context將成為該Host的默認Context

    所有無法和其它Context的路徑名匹配的請求都將最終和該默認Context匹配

    4.3 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-結構原理

5 - Context的部署配置文件web.xml的說明

一個Context對應於一個Web App,每個Web App是由一個或者多個servlet組成的

當一個Web App被初始化的時候,它將用自己的ClassLoader對象載入“部署配置文件web.xml”中定義的每個servlet類

它首先載入在$CATALINA_HOME/conf/web.xml中部署的servlet類

然後載入在自己的Web App根目錄下的WEB-INF/web.xml中部署的servlet類

web.xml文件有兩部分:servlet類定義和servlet映射定義

每個被載入的servlet類都有一個名字,且被填入該Context的映射表(mapping table)中,和某種URL PATTERN對應

當該Context獲得請求時,將查詢mapping table,找到被請求的servlet,並執行以獲得請求回應

分析一下所有的Context共享的web.xml文件,在其中定義的servlet被所有的Web App載入

三、例子

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

假設來自客戶的請求為:

http://localhost:8080/wsota/wsota_index.jsp

請求被髮送到本機端口8080,被在那裡偵聽的Coyote HTTP/1.1 Connector獲得

  1. Connector把該請求交給它所在的Service的Engine來處理,並等待來自Engine的回應

  2. Engine獲得請求localhost/wsota/wsota_index.jsp,匹配它所擁有的所有虛擬主機Host

  3. Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理,因為該Host被定義為該Engine的默認主機)

  4. localhost Host獲得請求/wsota/wsota_index.jsp,匹配它所擁有的所有Context

  5. Host匹配到路徑為/wsota的Context(如果匹配不到就把該請求交給路徑名為""的Context去處理)

  6. path="/wsota"的Context獲得請求/wsota_index.jsp,在它的mapping table中尋找對應的servlet

  7. Context匹配到URL PATTERN為*.jsp的servlet,對應於JspServlet類

  8. 構造HttpServletRequest對象和HttpServletResponse對象,作為參數調用JspServlet的doGet或doPost方法

  9. Context把執行完了之後的HttpServletResponse對象返回給Host

  10. Host把HttpServletResponse對象返回給Engine

  11. Engine把HttpServletResponse對象返回給Connector

  12. Connector把HttpServletResponse對象返回給客戶browser


分享到:


相關文章: