1. 程式人生 > >tomcat的結構 以及處理請求的流程

tomcat的結構 以及處理請求的流程

1. Tomcat結構
Tomcat是一個基於元件的伺服器,它的構成元件都是可配置的,其中最外層的元件是Catalina Servlet容器,其他的元件按照一定的格式要求配置在這個頂層容器中。Tomcat的各個元件是在<TOMCAT_HOME>\conf\server.xml檔案中配置的,Tomcat伺服器預設情況下對各種元件都有預設的實現,下面通過分析server.xml檔案來理解Tomcat的各個元件是如何組織的。server.xml檔案的基本組成結構如下。


XML配置檔案結構
<Server>                     頂層類元素:一個配置檔案中只能有一個<Server>元素,可包含多個Service。
    <Service>                頂層類元素:本身不是容器,可包含一個Engine,多個Connector。
        <Connector/>         聯結器類元素:代表通訊介面。
           <Engine>   容器類元素:為特定的Service元件處理所有客戶請求,可包含多個Host。
              <Host>    容器類元素:為特定的虛擬主機處理所有客戶請求,可包含多個Context。
                 <Context>   容器類元素:為特定的Web應用處理所有客戶請求。
                 </Context>
               </Host>
              </Engine>
     </Service>
</Server>

1)Service
Service元件是一些Connector元件的集合,它本身不是一個容器,所以在這裡不能定義日誌等元件。一個Service元件中只能有一個Engine元件,可以包含多個Connector元件。

2)Connector元件
Connector元件表示一個介面,通過這個介面接收客戶的請求,然戶傳送給其他的容器元件,最後再把伺服器的響應結果傳遞給客戶。

3) Engine, Host和context
上面介紹的3個元件本身並不能處理客戶請求,也不能生成響應。在Tomcat中只有3個元件是可以處理客戶請求並生成響應的,這3個元件分別是 Engine、Host和Context元件。這3個元件分別代表了不同的服務範圍,通過巢狀關係可以知道3個元件的範圍有如下的關係:Engine>Host>Context。
a.Engine元件下可以包含多個Host元件,它為特定的Service元件處理所有客戶請求。
b.一個Host元件代表一個虛擬主機,一個虛擬主機中可以包含多個Web應用(Context元件)。
c.Context元件代表一個Web應用。
Tomcat的各個元件關係,可以用下圖描述。

2. Tomcat處理一個HTTP請求的過程
假設來自客戶的請求為: http://localhost:8080/wsota/wsota_index.jsp 
1) 請求被髮送到本機埠8080,被在那裡偵聽的Coyote HTTP/1.1 Connector獲得 
2) Connector把該請求交給它所在的Service的Engine來處理,並等待來自Engine的迴應 
3) Engine獲得請求localhost/wsota/wsota_index.jsp,匹配它所擁有的所有虛擬主機Host 
4) Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理,因為該Host被定義為該Engine的預設主機) 
5) localhost Host獲得請求/wsota/wsota_index.jsp,匹配它所擁有的所有Context 
6) Host匹配到路徑為/wsota的Context(如果匹配不到就把該請求交給路徑名為""的Context去處理) 
7) path="/wsota"的Context獲得請求/wsota_index.jsp,在它的mapping table中尋找對應的servlet 
8) Context匹配到URL PATTERN為*.jsp的servlet,對應於JspServlet類 
9) 構造HttpServletRequest物件和HttpServletResponse物件,作為引數呼叫JspServlet的doGet或doPost方法 
10)Context把執行完了之後的HttpServletResponse物件返回給Host 
11)Host把HttpServletResponse物件返回給Engine 
12)Engine把HttpServletResponse物件返回給Connector 
13)Connector把HttpServletResponse物件返回給客戶browser