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

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

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

    Java愛好者

    一個堅定的Java愛好者,歡迎和我討論
    隨筆 - 7, 文章 - 8, 評論 - 6, 引用 - 0
    數據加載中……

    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 o-ne 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 o-ne 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

    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

    ?

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

    ?

    				<!-------------------------------------------------------------------------> 
    		
    				<!-- 啟動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>  
    				<!---------------------------------------------------------------> 
    		

    posted on 2006-06-23 13:03 JStar 閱讀(224) 評論(0)  編輯  收藏 所屬分類: TOMCATJAVA文摘


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


    網站導航:
     
    主站蜘蛛池模板: 你懂的网址免费国产| 亚洲精品伦理熟女国产一区二区| 久久性生大片免费观看性| 亚洲国产国产综合一区首页| 美女内射毛片在线看免费人动物| 亚洲午夜福利在线视频| 亚洲成人国产精品| 国产一精品一AV一免费孕妇| 亚洲精品无码中文久久字幕| 国产在线观看免费完整版中文版 | 亚洲GV天堂GV无码男同| 四虎影院免费视频| 一区二区三区免费在线观看| 91亚洲精品第一综合不卡播放| 国产美女无遮挡免费视频网站| 又粗又长又爽又长黄免费视频 | 亚洲另类自拍丝袜第五页| 亚洲精品无码午夜福利中文字幕 | 成年人免费的视频| 国产亚洲一区二区三区在线观看| 91亚洲自偷在线观看国产馆| 久久久亚洲精华液精华液精华液| 日韩欧毛片免费视频| 国产va免费精品| 亚洲国产av美女网站| 99精品在线免费观看| 中文字幕亚洲激情| 男人和女人高潮免费网站 | 国产精品高清视亚洲精品| 日本不卡视频免费| 亚洲熟女综合色一区二区三区| 啦啦啦高清视频在线观看免费 | 黄色a三级三级三级免费看| 久久精品国产亚洲香蕉| 天天干在线免费视频| 在线精品自拍亚洲第一区| 亚洲国产一区二区视频网站| 亚洲乱码在线观看| 国产日本一线在线观看免费| 国产午夜亚洲精品| 免费一级毛片在线播放不收费|