1. 程式人生 > >Tomcat(一):簡介

Tomcat(一):簡介

一、概念

    Tomcat 伺服器是一個開源的輕量級Web應用伺服器,在中小型系統和併發量小的場合下被普遍使用,是開發和除錯Servlet、JSP 程式的首選。

二、原理

    Tomcat結構圖:

                

    Tomcat主要元件:伺服器Server,服務Service,聯結器Connector、容器Container。聯結器Connector和容器Container是Tomcat的核心。

    一個Container容器和一個或多個Connector組合在一起,加上其他一些支援的元件共同組成一個Service服務,有了Service服務便可以對外提供能力了,但是Service服務的生存需要一個環境,這個環境便是Server,Server元件為Service服務的正常使用提供了生存環境,Server元件可以同時管理一個或多個Service服務。


三、兩大元件

1、Connector

    一個Connecter將在某個指定的埠上偵聽客戶請求,接收瀏覽器的發過來的 tcp 連線請求,建立一個 Request 和 Response 物件分別用於和請求端交換資料,然後會產生一個執行緒來處理這個請求並把產生的 Request 和 Response 物件傳給處理Engine(Container中的一部分),從Engine出獲得響應並返回客戶。 
Tomcat中有兩個經典的Connector,一個直接偵聽來自Browser的HTTP請求,另外一個來自其他的WebServer請求。HTTP/1.1 Connector在埠8080處偵聽來自客戶Browser的HTTP請求,AJP/1.3 Connector在埠8009處偵聽其他Web Server(其他的HTTP伺服器

)的Servlet/JSP請求。 
Connector 最重要的功能就是接收連線請求然後分配執行緒讓 Container 來處理這個請求,所以這必然是多執行緒的,多執行緒的處理是 Connector 設計的核心。

2、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 的各種資訊打交道。

3、其他元件

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

四、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。