Tomcat是一個免費的開放源碼的Serlvet容器,它是Apache基金會的Jakarta項目中的一個核心項目,也是sun公司官方推薦的servlet和jsp容器,同時它還獲得過多種榮譽。servlet和jsp的最新規範都可以在tomcat的新版本中得到實現。Tomcat具有輕量級和靈活嵌入到應用系統中的優點,所以得到了廣泛的應用。在Tomcat的發展中,Sun在1999年六月宣佈參與Jakarta項目的Tomcat servlet容器和Jsp引擎的開發,使得Tomcat在3.x和4.x版之間系統設計上發生了比較大的變化。Tomcat的其他信息我就不多說了。有興趣的朋友可以訪問http://jakarta.apache.org/ 的官方網站得到更多的信息。
Tomcat 服務器是由一系列可配置的組件構成,其中核心組件是 Catalina Servlet 容器,它是所有其他 Tomcat 組件的頂層容器。Tomcat 的組件可以在 <CATALINA_HOME>/conf/server.xml 文件中進行配置,每個 Tomcat 組件在 server.xml 文件中對應一種配置元素。
Tomcat 的結構如下:
一個Server可以有多個Service,
一個Service只有一個Engine,一個Http Connector,一個 AJP Connector。
一個Engine可以有多個Host,
一個Host可以有多個Context,
其中每個部分的含義:
Service:
Service是這樣一個集合:它由一個或者多個Connector組成,以及一個Engine,負責處理所有Connector所獲得的客戶請求
Connector:
一個Connector將在某個指定端口上偵聽客戶請求,並將獲得的請求交給Engine來處理,從Engine處獲得迴應並返回客戶
TOMCAT有兩個典型的Connector,一個直接偵聽來自browser的http請求,一個偵聽來自其它WebServer的請求
Coyote Http/1.1 Connector 在端口8080處偵聽來自客戶browser的http請求
Coyote JK2 Connector 在端口8009處偵聽來自其它WebServer(Apache)的servlet/jsp代理請求
Engine:
Engine下可以配置多個虛擬主機Virtual Host,每個虛擬主機都有一個域名
當Engine獲得一個請求時,它把該請求匹配到某個Host上,然後把該請求交給該Host來處理
Engine有一個默認虛擬主機,當請求無法匹配到任何一個Host上的時候,將交給該默認Host來處理
Host:
代表一個Virtual Host,虛擬主機,每個虛擬主機和某個網絡域名Domain Name相匹配
每個虛擬主機下都可以部署(deploy)一個或者多個Web App,每個Web App對應於一個Context,有一個Context path
當Host獲得一個請求時,將把該請求匹配到某個Context上,然後把該請求交給該Context來處理
匹配的方法是“最長匹配”,所以一個path==""的Context將成爲該Host的默認Context
所有無法和其它Context的路徑名匹配的請求都將最終和該默認Context匹配
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 Server處理一個http請求的過程,假設來自客戶的請求爲:http://localhost:8080/test/index.jsp
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的默認主機)
5. localhost Host獲得請求/test/index.jsp,匹配它所擁有的所有Context
6. Host匹配到路徑爲/test的Context(如果匹配不到就把該請求交給路徑名爲""的Context去處理)
7. path="/test"的Context獲得請求/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