1 - Tomcat Server的組成部分
1.1 - Server
A Server element represents the entire Catalina servlet container. (Singleton)
1.2 - Service
A Service element represents the combination of one or more Connector components that share a single Engine
Service是這樣一個集合:它由一個或者多個Connector組成,以及一個Engine,負責處理所有Connector所獲得的客戶請求
1.3 - 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代理請求
1.4 - Engine
The Engine element represents the entire request processing machinery associated with a particular Service
It receives and processes all requests from one or more Connectors
and returns the completed response to the Connector for ultimate transmission back to the client
Engine下可以配置多個虛拟主機Virtual Host,每個虛拟主機都有一個域名
當Engine獲得一個請求時,它把該請求比對到某個Host上,然後把該請求交給該Host來處理
Engine有一個預設虛拟主機,當請求無法比對到任何一個Host上的時候,将交給該預設Host來處理
1.5 - Host
代表一個Virtual Host,虛拟主機,每個虛拟主機和某個網絡域名Domain Name相比對
每個虛拟主機下都可以部署(deploy)一個或者多個Web App,每個Web App對應于一個Context,有一個Context path
當Host獲得一個請求時,将把該請求比對到某個Context上,然後把該請求交給該Context來處理
比對的方法是“最長比對”,是以一個path==""的Context将成為該Host的預設Context
所有無法和其它Context的路徑名比對的請求都将最終和該預設Context比對
1.6 - Context
一個Context對應于一個Web Application,一個Web Application由一個或者多個Servlet組成
Context在建立的時候将根據配置檔案$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml載入Servlet類
當Context獲得請求時,将在自己的映射表(mapping table)中尋找相比對的Servlet類
如果找到,則執行該類,獲得請求的回應,并傳回
2 - Tomcat Server的結構圖
3 - 配置檔案$CATALINA_HOME/conf/server.xml的說明
該檔案描述了如何啟動Tomcat Server
4 - 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載入
5 - Tomcat Server處理一個http請求的過程
假設來自客戶的請求為:
http://localhost:8080/wsota/wsota_index.jsp
- 請求被發送到本機端口8080,被在那裡偵聽的Coyote HTTP/1.1 Connector獲得
- Connector把該請求交給它所在的Service的Engine來處理,并等待來自Engine的回應
- Engine獲得請求localhost/wsota/wsota_index.jsp,比對它所擁有的所有虛拟主機Host
- Engine比對到名為localhost的Host(即使比對不到也把請求交給該Host處理,因為該Host被定義為該Engine的預設主機)
- localhost Host獲得請求/wsota/wsota_index.jsp,比對它所擁有的所有Context
- Host比對到路徑為/wsota的Context(如果比對不到就把該請求交給路徑名為""的Context去處理)
- path="/wsota"的Context獲得請求/wsota_index.jsp,在它的mapping table中尋找對應的servlet
- Context比對到URL PATTERN為*.jsp的servlet,對應于JspServlet類
- 構造HttpServletRequest對象和HttpServletResponse對象,作為參數調用JspServlet的doGet或doPost方法
- Context把執行完了之後的HttpServletResponse對象傳回給Host
- Host把HttpServletResponse對象傳回給Engine
- Engine把HttpServletResponse對象傳回給Connector
- Connector把HttpServletResponse對象傳回給客戶browser
轉自:http://blog.sina.com.cn/s/blog_7cc931cb01014r6n.html
未來星開發團隊--狒狒
QQ:9715234