[轉] tomcat組成及工做原理

1 - Tomcat Server的組成部分

1.1 - Serverhtml

A Server element represents the entire Catalina servlet container. (Singleton)web

1.2 - Serviceapache

A Service element represents the combination of one or more Connector components that share a single Engine
Service是這樣一個集合:它由一個或者多個Connector組成,以及一個Engine,負責處理全部Connector所得到的客戶請求tomcat

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 - Engineapp

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來處理webapp

1.5 - Hostjsp

 

表明一個Virtual Host,虛擬主機,每一個虛擬主機和某個網絡域名Domain Name相匹配
每一個虛擬主機下均可以部署(deploy)一個或者多個Web App,每一個Web App對應於一個Context,有一個Context path
當Host得到一個請求時,將把該請求匹配到某個Context上,而後把該請求交給該Context來處理
匹配的方法是「最長匹配」,因此一個path==""的Context將成爲該Host的默認Context
全部沒法和其它Context的路徑名匹配的請求都將最終和該默認Context匹配ui

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

 

 <!-----------------------------------------------------------------------------------------------> 

 <!-- 啓動Server 在端口8005處等待關閉命令 若是接受到"SHUTDOWN"字符串則關閉服務器 --> 
<Server port="8005" shutdown="SHUTDOWN" debug="0">

 <!-- Listener ??? 目前沒有看到這裏 --> 
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" debug="0"/>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" debug="0"/>

 <!-- Global JNDI resources ??? 目前沒有看到這裏,先略去 --> 
  <GlobalNamingResources>
    ... ... ... ...
  </GlobalNamingResources>

 <!-- Tomcat的Standalone Service Service是一組Connector的集合 它們共用一個Engine來處理全部Connector收到的請求 --> 
  <Service name="Tomcat-Standalone">

 <!-- Coyote HTTP/1.1 Connector className : 該Connector的實現類是org.apache.coyote.tomcat4.CoyoteConnector port : 在端口號8080處偵聽來自客戶browser的HTTP1.1請求 minProcessors : 該Connector先建立5個線程等待客戶請求,每一個請求由一個線程負責 maxProcessors : 當現有的線程不夠服務客戶請求時,若線程總數不足75個,則建立新線程來處理請求 acceptCount : 當現有線程已經達到最大數75時,爲客戶請求排隊 當隊列中請求數超過100時,後來的請求返回Connection refused錯誤 redirectport : 當客戶請求是https時,把該請求轉發到端口8443去 其它屬性略 --> 
    <Connector className="org.apache.coyote.tomcat4.CoyoteConnector" 
               port="8080" 
               minProcessors="5" maxProcessors="75" acceptCount="100" 
               enableLookups="true" 
               redirectPort="8443" 
               debug="0" 
               connectionTimeout="20000" 
               useURIValidationHack="false" 
               disableUploadTimeout="true" />

 <!-- Engine用來處理Connector收到的Http請求 它將匹配請求和本身的虛擬主機,並把請求轉交給對應的Host來處理 默認虛擬主機是localhost --> 
    <Engine name="Standalone" defaultHost="localhost" debug="0">
    
 <!-- 日誌類,目前沒有看到,略去先 --> 
      <Logger className="org.apache.catalina.logger.FileLogger" .../>
 <!-- Realm,目前沒有看到,略去先 --> 
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm" .../>

 <!-- 虛擬主機localhost appBase : 該虛擬主機的根目錄是webapps/ 它將匹配請求和本身的Context的路徑,並把請求轉交給對應的Context來處理 --> 
      <Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true">
      
 <!-- 日誌類,目前沒有看到,略去先 --> 
        <Logger className="org.apache.catalina.logger.FileLogger" .../>
      
 <!-- Context,對應於一個Web App path : 該Context的路徑名是"",故該Context是該Host的默認Context docBase : 該Context的根目錄是webapps/mycontext/ --> 
        <Context path="" docBase="mycontext" debug="0"/>
        
 <!-- 另一個Context,路徑名是/wsota --> 
        <Context path="/wsota" docBase="wsotaProject" debug="0"/>
             
        
      </Host>
      
    </Engine>

  </Service>

</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載入

 

 <!-----------------------------------------------------------------------------------------------> 

<web-app>

 <!-- 概述: 該文件是全部的WEB APP共用的部署配置文件, 每當一個WEB APP被DEPLOY,該文件都將先被處理,而後纔是WEB APP本身的/WEB-INF/web.xml --> 

 <!-- +-------------------------+ --> <!-- | servlet類定義部分 | --> <!-- +-------------------------+ --> 
  
 <!-- DefaultServlet 當用戶的HTTP請求沒法匹配任何一個servlet的時候,該servlet被執行 URL PATTERN MAPPING : / --> 
    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.DefaultServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

 <!-- InvokerServlet 處理一個WEB APP中的匿名servlet 當一個servlet被編寫並編譯放入/WEB-INF/classes/中,卻沒有在/WEB-INF/web.xml中定義的時候 該servlet被調用,把匿名servlet映射成/servlet/ClassName的形式 URL PATTERN MAPPING : /servlet/* --> 
    <servlet>
        <servlet-name>invoker</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>

 <!-- JspServlet 當請求的是一個JSP頁面的時候(*.jsp)該servlet被調用 它是一個JSP編譯器,將請求的JSP頁面編譯成爲servlet再執行 URL PATTERN MAPPING : *.jsp --> 
    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>logVerbosityLevel</param-name>
            <param-value>WARNING</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>


 <!-- +---------------------------+ --> <!-- | servlet映射定義部分 | --> <!-- +---------------------------+ --> 
    
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>invoker</servlet-name>
        <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
    </servlet-mapping>

 <!-- +------------------------+ --> <!-- | 其它部分,略去先 | --> <!-- +------------------------+ --> 
    ... ... ... ...

</web-app>

 <!-----------------------------------------------------------------------------------------------> 

 

5 - Tomcat Server處理一個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

 

轉載自:http://docs.huihoo.com/apache/tomcat/heavyz/01-startup.html

相關文章
相關標籤/搜索