<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Tomcat啟動分析

    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,負(fù)責(zé)處理所有Connector所獲得的客戶請求

    1.3 - Connector

    一個Connector將在某個指定端口上偵聽客戶請求,并將獲得的請求交給Engine來處理,從Engine處獲得回應(yīng)并返回客戶
    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,每個虛擬主機都有一個域名
    當(dāng)Engine獲得一個請求時,它把該請求匹配到某個Host上,然后把該請求交給該Host來處理
    Engine有一個默認(rèn)虛擬主機,當(dāng)請求無法匹配到任何一個Host上的時候,將交給該默認(rèn)Host來處理

    1.5 - Host

    代表一個Virtual Host,虛擬主機,每個虛擬主機和某個網(wǎng)絡(luò)域名Domain Name相匹配
    每個虛擬主機下都可以部署(deploy)一個或者多個Web App,每個Web App對應(yīng)于一個Context,有一個Context path
    當(dāng)Host獲得一個請求時,將把該請求匹配到某個Context上,然后把該請求交給該Context來處理
    匹配的方法是“最長匹配”,所以一個path==""的Context將成為該Host的默認(rèn)Context
    所有無法和其它Context的路徑名匹配的請求都將最終和該默認(rèn)Context匹配

    1.6 - Context

    一個Context對應(yīng)于一個Web Application,一個Web Application由一個或者多個Servlet組成
    Context在創(chuàng)建的時候?qū)⒏鶕?jù)配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml載入Servlet類
    當(dāng)Context獲得請求時,將在自己的映射表(mapping table)中尋找相匹配的Servlet類
    如果找到,則執(zhí)行該類,獲得請求的回應(yīng),并返回

    2 - Tomcat Server的結(jié)構(gòu)圖

    3 - 配置文件$CATALINA_HOME/conf/server.xml的說明

    該文件描述了如何啟動Tomcat Server

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



    <!-- 啟動Server
    在端口8005處等待關(guān)閉命令
    如果接受到"SHUTDOWN"字符串則關(guān)閉服務(wù)器
    -->

    <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的實現(xiàn)類是org.apache.coyote.tomcat4.CoyoteConnector
    port : 在端口號8080處偵聽來自客戶browser的HTTP1.1請求
    minProcessors : 該Connector先創(chuàng)建5個線程等待客戶請求,每個請求由一個線程負(fù)責(zé)
    maxProcessors : 當(dāng)現(xiàn)有的線程不夠服務(wù)客戶請求時,若線程總數(shù)不足75個,則創(chuàng)建新線程來處理請求
    acceptCount : 當(dāng)現(xiàn)有線程已經(jīng)達(dá)到最大數(shù)75時,為客戶請求排隊
    當(dāng)隊列中請求數(shù)超過100時,后來的請求返回Connection refused錯誤
    redirectport : 當(dāng)客戶請求是https時,把該請求轉(zhuǎn)發(fā)到端口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請求
    它將匹配請求和自己的虛擬主機,并把請求轉(zhuǎn)交給對應(yīng)的Host來處理
    默認(rèn)虛擬主機是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的路徑,并把請求轉(zhuǎn)交給對應(yīng)的Context來處理
    -->

    <Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true">


    <!-- 日志類,目前沒有看到,略去先 -->

    <Logger className="org.apache.catalina.logger.FileLogger" .../>


    <!-- Context,對應(yīng)于一個Web App
    path : 該Context的路徑名是"",故該Context是該Host的默認(rèn)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對應(yīng)于一個Web App,每個Web App是由一個或者多個servlet組成的
    當(dāng)一個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對應(yīng)
    當(dāng)該Context獲得請求時,將查詢mapping table,找到被請求的servlet,并執(zhí)行以獲得請求回應(yīng)

    分析一下所有的Context共享的web.xml文件,在其中定義的servlet被所有的Web App載入

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


    <web-app>


    <!-- 概述:
    該文件是所有的WEB APP共用的部署配置文件,
    每當(dāng)一個WEB APP被DEPLOY,該文件都將先被處理,然后才是WEB APP自己的/WEB-INF/web.xml
    -->



    <!-- +-------------------------+ -->
    <!-- | servlet類定義部分 | -->
    <!-- +-------------------------+ -->



    <!-- DefaultServlet
    當(dāng)用戶的HTTP請求無法匹配任何一個servlet的時候,該servlet被執(zhí)行
    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
    當(dāng)一個servlet被編寫并編譯放入/WEB-INF/classes/中,卻沒有在/WEB-INF/web.xml中定義的時候
    該servlet被調(diào)用,把匿名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
    當(dāng)請求的是一個JSP頁面的時候(*.jsp)該servlet被調(diào)用
    它是一個JSP編譯器,將請求的JSP頁面編譯成為servlet再執(zhí)行
    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請求的過程

    假設(shè)來自客戶的請求為:
    http://localhost:8080/wsota/wsota_index.jsp

    1) 請求被發(fā)送到本機端口8080,被在那里偵聽的Coyote HTTP/1.1 Connector獲得
    2) Connector把該請求交給它所在的Service的Engine來處理,并等待來自Engine的回應(yīng)
    3) Engine獲得請求localhost/wsota/wsota_index.jsp,匹配它所擁有的所有虛擬主機Host
    4) Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理,因為該Host被定義為該Engine的默認(rèn)主機)
    5) localhost Host獲得請求/wsota/wsota_index.jsp,匹配它所擁有的所有Context
    6) Host匹配到路徑為/wsota的Context(如果匹配不到就把該請求交給路徑名為""的Context去處理)
    7) path="/wsota"的Context獲得請求/wsota_index.jsp,在它的mapping table中尋找對應(yīng)的servlet
    8) Context匹配到URL PATTERN為*.jsp的servlet,對應(yīng)于JspServlet類
    9) 構(gòu)造HttpServletRequest對象和HttpServletResponse對象,作為參數(shù)調(diào)用JspServlet的doGet或doPost方法
    10)Context把執(zhí)行完了之后的HttpServletResponse對象返回給Host
    11)Host把HttpServletResponse對象返回給Engine
    12)Engine把HttpServletResponse對象返回給Connector
    13)Connector把HttpServletResponse對象返回給客戶browser

    posted on 2008-04-13 19:23 金家寶 閱讀(285) 評論(0)  編輯  收藏 所屬分類: Tomcat


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 一级做a爱过程免费视频高清| 你懂的免费在线观看网站| 亚洲精品尤物yw在线影院 | 国产在线播放线91免费| 久久久久亚洲Av片无码v| 在线v片免费观看视频| 一个人免费观看日本www视频 | 亚洲gv白嫩小受在线观看| 亚洲第一成年免费网站| 一区二区三区免费看| 亚洲国产成人精品无码区在线网站| 无码国模国产在线观看免费| 免费网站观看WWW在线观看| 亚洲偷自拍另类图片二区| 自拍偷自拍亚洲精品被多人伦好爽| 免费不卡视频一卡二卡| 亚洲精品偷拍视频免费观看| 亚洲xxxx18| 亚洲国产精品婷婷久久| 免费人妻av无码专区| 韩国免费一级成人毛片| 99精品免费视品| 春暖花开亚洲性无区一区二区| 亚洲国产美国国产综合一区二区| 国产亚洲精品免费| 114一级毛片免费| 永久免费av无码入口国语片| 韩国日本好看电影免费看| 一级毛片在线观看免费| aaa毛片免费观看| 久久精品熟女亚洲av麻豆| 亚洲精品中文字幕无乱码| 亚洲情综合五月天| 免费人成年激情视频在线观看| 国产精品爱啪在线线免费观看| 18禁在线无遮挡免费观看网站| 日韩毛片一区视频免费| 亚洲av日韩精品久久久久久a| 亚洲欧洲日产国码www| 亚洲国产精品人久久| 亚洲av永久无码精品表情包|