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

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

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

    HelloWorld 善戰者,求之于勢,不責于人;故能擇人而任勢。

    知止而后有定,定而后能靜,靜而后能安,安而后能慮,慮而后能得。物有本末,事有終始。知所先后,則近道矣。

      BlogJava :: 首頁 ::  :: 聯系 ::  :: 管理 ::
      167 隨筆 :: 1 文章 :: 40 評論 :: 0 Trackbacks
    Tomcat5啟動流程與配置詳解  
    星期日 2007年08月19日

    Tomcat5啟動流程與配置詳解

     

    雖然版本已經更新蠻多的了,但是了解以前的還是有很大幫助的。

    1.Tomcat5.0 目錄結構
        Tomcat下有9個目錄,分別是bin,common,conf,logs,server,shared,temp,webapps,work 目錄,現在對每一目錄做介紹。Tomcat根目錄在tomcat中叫<CATALINA_HOME>。

    -<CATALINA_HOME>/bin-
        存放各種平臺下啟動和關閉Tomcat的腳本文件。startup.bat是windows下啟動tomcat的文件,shutdown.bat是關閉tomcat的文件。

    -<CATALINA_HOME>/common-
        在common目錄下的lib目錄,存放Tomcat服務器和所有web應用都能訪問的JAR。

    -<CATALINA_HOME>/shared-
        在shared目錄下的lib目錄,存放所有web應用能訪問的,但Tomcat不能訪問的JAR。

    -<CATALINA_HOME>/server-
        在server/webapps目錄中,存放Tomcat自帶的兩個APP-admin和manager應用,使用來管理Tomcat-web服務用的。在server/lib目錄中,存放tomcat服務器所需要的各web應用不能訪問種jar。

    -<CATALINA_HOME>/work –
        Tomcat把各種由jsp生成的servlet文件放在這個目錄下。

    -<CATALINA_HOME>/temp –
        臨時活頁夾,Tomcat運行時候存放臨時文件用的。

    -<CATALINA_HOME>/logs –
        存放Tomcat的日志文件。

    -<CATALINA_HOME>/conf –
        Tomcat的各種配置文件,最重要的是 server.xml。(下文將詳細介紹此文件)

    -<CATALINA_HOME>/webapps-
        web應用的發布目錄,把 java開發的web站點或war文件放入這個目錄下就可以通過tomcat服務器訪問了。

    2.Tomcat的啟動
        Tomcat的啟動是從解析bat文件開始,bat文件最終調用org.apache.catalina.startup.Bootstrap開始類的加載。

    2.1 TOMCAT自己的類載入器(ClassLoader)加載流程如下:
           +---------------------------+
           |         Bootstrap         |
           |             |             |
           |          System           |
           |             |             |
           |          Common           |
           |         /      \          |
           |     Catalina  Shared      |
           +---------------------------+
    其中:
    -Bootstrap –
        載入JVM自帶的類和$JAVA_HOME/jre/lib/ext/*.jar。

    - System -
    ①載入$CATALINA_HOME/bin/bootstrap.jar  初始化Tomcat,執行Main方法。
    ②$JAVA_HOME/lib/tools.jar  Sun的工具類,包括編譯Jsp為Servlet的工具類。

    - Common -
        這個目錄下的類雖然對TOMCAT和所有的WEB APP都可見。但是Web App的類不應該放在這個目錄下,所有未打包的Class都在$CATALINA_HOME/common/classes下,所有打包的jar都在$CATALINA_HOME/commons/endorsed和$CATALINA_HOME/common/lib下,默認情況會包含以下幾個包:
    ①jndi.jar JNDI API接口,這個包僅在Java1.2時候裝入,1.3以后的版本JDK已自動裝入。
    ②naming-common.jar JNDI接口實現類,Tomcat用這些類在內存中使用Context。
    ③naming-resources.jar JNDI實現,Tomcat用它們定位Web App的靜態資源。
    ④servlet.jar Servlet,Jsp API。
    ⑤xerces.jar XML解析器,特定的Web App可以在自己的/WEB-INF/lib 中覆蓋。

    - Catalina -
        裝入Tomcat實現所有接口的類,這些類對Web App是完全不可見的,所有未打包的類在$CATALINA_HOME/server/classes,所有jar包在$CATALINA_HOME/server/lib下。一般情況該ClassLoader將Load下面幾個包:
    ①catalina.jar Servlet容器的Tomcat實現包。
    ②jakarta-regexp-X.Y.jar 正則表達式,請求過濾時使用。
    ③servlets-xxxxx.jar Servlet支持包。
    ④tomcat-coyote.jar Tomcat的Coyote連接實現包。
    ⑤tomcat-jk.jar Web Server綁定包,允許Tomcat綁定Apache等作為Web Server。
    ⑥tomcat-jk2.jar 功能同上。
    ⑦tomcat-util.jar Tomcat工具類,可能被一些Connector用到。
    ⑧tomcat-warp.jar 用于Apache Server包。

    - Shared -
        載入所有WEB APP都可見的類,對TOMCAT不可見。 所有未打包的類在$CATALINA_HOME/shared/classes,所有jar包在$CATALINA_HOME /lib下。默認情況包含下面幾個包:
    ①jasper-compiler.jar Jsp編譯器,編譯Jsp為Servlet。
    ②jasper-runtime.jar Jsp(已編譯成Servlet)運行支持包。
    ③naming-factory.jar 支持Web App使用JNDI的封裝包。

    -WebAppX -
        Web App ClassLoader,Web App被部署是在該ClassLoader被創建的時候。所有class都在WEB-INF/classes下,所有jar在WEB-INF/lib下。特別注意WEB APP自己的ClassLoader的實現與眾不同:
        它先試圖從WEB APP自己的目錄里載入,如果失敗則請求父ClassLoader的代理。這樣可以讓不同的WEB APP之間的類載入互不干擾.另,Tomcat Server使用的是Catalina   ClassLoader,一般的Web App使用的是WebApp ClassLoader。

    2.2 下面總結Tomcat類加載過程
    Bootstrap($JAVA_HOME/jre/lib/ext/*.jar)
    System($CLASSPATH/*.class和指定的jar)
    Common($CATALINA_HOME/common 下的classes,lib,endores三個子目錄)
    Catalina ($CATALINA_HOME/server/下的classes和lib目錄僅對Tomcat可見)
    Shared($CATALINA_HOME/shared/下的classes和lib目錄以及$CATALINA_HOME/lib目錄)
        僅對Web應用程序可見,對Tomcat不可見WebApp($WEBAPP/Web-INF/*僅對該WEB應用可見classes/*.class lib/*.jar)

    2.3加載類和資源的順序為:
    1、/Web-INF/classes
    2、/Web-INF/lib/*.jar
    3、Bootstrap
    4、System
    5、$CATALINA_HOME/common/classes
    6、$CATALINA_HOME/common/endores/*.jar
    7、$CATALINA_HOME/common/lib/*.jar
    8、$CATALINA_HOME/shared/classes
    9、$CATALINA_HOME/shared/lib/*.jar

    3.server.xml
    3.1配置tomcat組件的XML文件server.xml:
    ①頂層類元素[Top Level Elements]: 位于整個配置文件的頂層, 包括<Server>和<Service>。
    ②連接器類元素[Connectors ]: 客戶和服務(容器類元素)間的通訊接口。接受客戶請求,返回響應結果<Connector>。
    ③容器類元素[Containers]: 處理客戶請求并且生成響應結果,包含3個:<Engine> <Host> <Context>。
    ④嵌套類元素[Nested Components]: 可以加入到容器中的元素,包括:<logger> <Valve><Realm>等。

    3.2下表為server.xml配置簡介:


    元素名

     屬性

     解釋


    server

     port

     指定一個端口,這個端口負責監聽關閉tomcat的請求


    shutdown

     指定向端口發送的命令字符串


    service

     name

     指定service的名字


    Connector
    (表示客戶端和service之間的連接)

     port

     指定服務器端要創建的端口號,并在這個端口監聽來自客戶端的請求


    minProcessors

     服務器啟動時創建的處理請求的線程數


    maxProcessors

     最大可以創建的處理請求的線程數


    enableLookups

     如果為true,則可以通過調用request.getRemoteHost()進行DNS查詢來得到遠程客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址


    redirectPort

     指定服務器正在處理http請求時收到了一個SSL傳輸請求后重定向的端口號


    acceptCount

     指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理


    connectionTimeout

     指定超時的時間數(以毫秒為單位)


    Engine
    (表示指定service中的請求處理機,接收和處理來自Connector的請求)

     defaultHost

     指定缺省的處理請求的主機名,它至少與其中的一個host元素的name屬性值是一樣的


    Context
    (表示一個web應用程序,通常為WAR文件,關于WAR的具體信息見servlet規范)

     docBase

     應用程序的路徑或者是WAR文件存放的路徑


    path

     表示此web應用程序的url的前綴,這樣請求的url為http://localhost:8080/path/****


    reloadable

     這個屬性非常重要,如果為true,則tomcat會自動檢測應用程序的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動裝載新的應用程序,我們可以在不重起tomcat的情況下改變應用程序


    host
    (表示一個虛擬主機)

     name

     指定主機名


    appBase

     應用程序基本目錄,即存放應用程序的目錄


    unpackWARs

     如果為true,則tomcat會自動將WAR文件解壓,否則不解壓,直接從WAR文件中運行應用程序


    Logger
    (表示日志,調試和錯誤信息)

     className

     指定logger使用的類名,此類必須實現org.apache.catalina.Logger 接口


    prefix

     指定log文件的前綴


    suffix

     指定log文件的后綴


    timestamp

     如果為true,則log文件名中要加入時間,如下例:localhost_log.2007-03-04.txt


    Realm
    (表示存放用戶名,密碼及role的數據庫)

     className

     指定Realm使用的類名,此類必須實現org.apache.catalina.Realm接口


    Valve
    (功能與Logger差不多,其prefix和suffix屬性解釋和Logger 中的一樣)

     className

     指定Valve使用的類名,如用org.apache.catalina.valves.AccessLogValve類可以記錄應用程序的訪問信息


    directory

     指定log文件存放的位置


    pattern

     有兩個值,common方式記錄遠程主機名或ip地址,用戶名,日期,第一行請求的字符串,HTTP響應代碼,發送的字節數。combined方式比common方式記錄的值更多

     

        一個<Server>包含一個或多個<Service>,一個<Service>包含唯一一個<Engine>和一個或多個<Connector>,多個 <Connector>共享一個<Engine>;一個<Engine>包含多個<Host>,每個<Host>定義一個虛擬主機,包含一個或多個web應用<Context>; <Context>元素是代表一個在虛擬主機上運行的Web應用。<Context>標簽的描述(Apache官方文檔):
        Please note that for tomcat 5.x, unlike tomcat 4.x, it is NOT recommended to place <Context> elements directly in the server.xml file. Instead, put them in the META-INF/context.xml directory of your WAR file or the conf directory as described above.

    3.3分析server.xml
    -Server-
        server元素是JVM的入口點,整個配置文件只有一個,因為server不是容器(container),因此不能嵌套子組件。server在某一指定的端口監聽shutdown命令。server可以包含一個或多個service實。

    -Service-
        service有共享同一個Container的一個或多個Connectors組成,一般Service就是一個Engine,但沒有明確規范要求如此。因為Service不是一個Container,因此不能在里面嵌套子組件(比如Loggers/Valves)。

    -Connector-
        connector就是一個Tomcat與客戶端的連接,Tomcat有兩種典型的Connector:http,JK2.http connector監聽來自Browser的連接(通常在我們熟悉的8080端口),JK2.來自其他WebServer的請求(默認在8009端口監聽)。Connector會把獲得的請求交給Engine處理。

    -Engine-
        Engine下可以配置多個虛擬主機Virtual Host,每個虛擬主機都有一個域名。當Engine獲得一個請求時,它把該請求匹配到某個Host上,然后把該請求交給該Host來處理。Engine有一個默認虛擬主機,當請求無法匹配到任何一個Host上的時候,將交給該默認Host來處理。

    -Host-
        host代表一個虛擬主機,默認是localhost,host下可以部署多個web application,在我們實際應用中一般要考慮問題的對象就是host。

    4.Tomcat主要組件類介紹
    4.1 org.apache.catalina.Lifecycle
        通用的組件聲明周期接口,一般Tomcat的組件都要實現這個接口(但不是必須的),這個接口是為所有組件提供相同的start和stop。

    4.2 org.apache.catalina. LifecycleListener
        該接口用于監聽一些重要事件(包括實現了Lifecycle接口組件產生的start,stop事件)。

    4.3 org.apache.catalina.Container
        容器是用于從客戶端取得請求(request)并且處理請求并回復給客戶端(response)的對象。容器可以支持(可選)pipeline,以便能在運行時按配置的順序處理請求。
        在Tomcat里面,容器在概念上存在以下幾層:
    -Engine-請求處理入口點,可以包含多個Host和Context。
    -Host-代表一個虛擬主機。
    -Context-代表單個ServletContext,可以包含多個Wrappers。
    -Wrapper-代表單個Servlet,如果Servlet實現了SingleThreadModel,可以代表單個Servlet的多個實例。
        容器為了實現自己的功能經常要綁定一些其他組件,這些組件的功能可能被共享,也可以被單獨定制,下面是被使用的組件:
    -Loader-ClassLoader,裝載Java Classes。
    -Logger-實現了ServletContext的log方法,用于記錄日志。
    -Manage-管理與容器綁定的session池。
    -Realm-用戶安全管理。
    -Resources-JNDI資源訪問

    4.4 org.apache.catalina. ContainerListener
        容器事件監聽器,注意的是start,stop是正常的生命周期事件(LiftcycleEvent)不是容器事件。

    4.5 org.apache.catalina. Pipeline
        Pipleline是Valve的集合,當invoke方法被調用時,它會按指定的順序調用Valve,它總是要求有一個Valve必須處理傳遞的request(一般是最后一個)并產生response,否則就把request傳遞到下一個Valve。
        一般一個容器僅綁定一個Pipleline實例,一般說來容器會把處理request的功能封裝到一個容器綁定的Valve里(這個Valve應該在Pipleline最后被執行)。為了完成這個功能,Pipleline提供了setBasic()方法以保證Valve被最后執行,而其他Valve按順序被調用。

    4.6 org.apache.catalina.Valve
        Valve是被綁定在一個Container上的請求處理組件,一組Valve被按順序綁定在一個Pipleline上。
        一個Valve可能按照一定的順序執行下面的動作:
    *1.檢查并且(或者)修改指定的Request和Response屬性。
    *2.檢查Request屬性,生成相應的Response并返回控制權到調用者。
    *3.檢查Request和Reponse屬性,包裝這些對象并增強它們的功能,然后把它們傳到下一個組件。
    *4.如果相應的Response沒有被產生(并且控制權也沒有被返回)調用Pipleline上的下一個Valve(如果有)通過方法context.invokeNext()。
    *5.檢查(但不修改)Response屬性(調用后面的Valve或Container產生的)。
        Valve一定不能作下面的事情:
    *1.改變Request的一些屬性(Change request properties that have already been used to direct the flow of processing control for this request)。
    *2.創建一個已經被創建并且已經被傳遞的Response。
    *3.在調用invokeNext()方法并返回后修改包含Response的HTTP Header信息。
    *4.在invokeNext()調用返回后在綁定Response上的輸出流上作任何調用。
         *@param request 將被處理的Request
         *@param response 將被創建的Response
         *@param context 被用來調用下一個Valve的Valve Context

    4.7 org.apache.catalina.ValveContext
        一個ValveContext是這樣一種機制:一個Valve可以觸發下一個Valve的調用,而不必知道機制的內在實現。

    4.8 org.apache.catalina.Engine
        Engine是一個容器,是Cataline的Servlet的入口點。當發布一個連接到Web Server的Cataline時可能不使用Engine,因為Connectior將使用Web Server的資源決定使用哪個Context處理Request。附屬于Engine的子容器根據Engine實現的不同可能是Host或Context(單個Servlet Context)。如果使用了Engine,在Cataline的層次中它就是頂層容器,因此setParent()應改拋出IllegalArgumentException異常。

    4.9 org.apache.catalina. Host
        Host是一個容器,它代表一個虛擬主機。當發布一個連接到Web Server的Cataline時可能不使用Host,因為Connectior將使用Web Server的資源決定使用哪個Context處理Request。Host所附屬的父容器通常是Engine,附屬于Host的子容器通常是Context(單個Servlet Context)。Host接口里面的方法多數都是關于修改Host屬性及設定默認的Context。這里我們不再一一列舉。

    4.10 org.apache.catalin. Context
        Context是一個容器,它代表一個ServletContext,一個Cataline Engline中的單個的Web Application。Context所附屬的父容器是Host,附屬于Context的子容器是Wrapper(代表單個Servlet)。Context接口里面多數是關于Web Application的設置的方法,我們可以參考Web.xml文件研究里面的方法,里面多數方法都是如何讀取Web.xml文件里的資源。

    4.11 org.apache.catalina.Wrapper
        Wrapper是一個容器,它代表單個Servlet。Wrapper管理Servlet的生命周期,包括調用init()和destory()方法。Wrapper所附屬的父容器是Context,沒有附屬于Wrapper的子容器,方法addChild()應該拋出IllegalArgumentException異常。Wrapper接口里面的方法都是關于讀取Servlet的屬性,可以參考Web.xml文件里面關于<servlet>標簽的定義。

    4.12 org.apache.catalina.Server
        Server是整個Catalina容器的入口點,可以包含多個Service和頂層資源元素。一般說來實現Server接口的類也應該同時實現Lifecycle接口,當start()和stop()方法被調用的時候調用Service相應的方法。
        Server負責在指定的端口監聽連接,當有連接被接受的時候,Server會分析請求的第一行信息,如果是SHUTDOWN則stop服務。可以參考Server.xml文件關于Server的定義。

    4.13 org.apache.catalina. Service
        Service是一個或多個共享同以Container的Connectiors的集合。
    JVM可以包含一個或多個Service實例,但它們相互之間是完全獨立的,它們僅共享JVM的資源。

    4.14 org.apache.catalina. Connector
        Connector是一個從客戶端接受請求(request)并生成回應(reponse)的組件。一個Connection通常執行下面的邏輯:
    1)從客戶端程序接受請求。
    2)創建Request和Response,并把下面這些屬性設置到這些對象。
        對所有的Request,connector,protocol,protocol,response,scheme,secure,serverName,serverPort,serverPort屬性必須被設置。contentLength,contentType通常也被設置。
        對所有的HttpRequests,method,queryString,requestedSessionCookie,requestedSessionId,requestedSessionURL,requestURI,secure屬性必須被設置。另外所有addXxx方法也必須被調用以記錄cookies,headers和locales信息。
        對所有的Responses屬性connector,request,stream屬性必須被設置。對HttpResponses來說,connector不會為它設置額外headers信息。

    5.WEB應用程序的目錄結構
        在WEB上發布的J2EE應用程序都有自己特定的目錄結構。假設創建一名為HELLOAPP的WEB項目。
    -HELLOAPP-WEB應用根目錄,所有JSP\HTML等文件均存放于此。
    -HELLOAPP/WEB-INF-存放WEb應用的發布描述文件web.xml。
    -HELLOAPP/WEB-INF/classes-存放各種class文件,servlet類文件也存放于此。
    -HELLOAPP/WEB-INF/lib-存放WEb應用所需的各種JAR文件。

    6.tomcat 虛擬主機配置
        第一步
    <Host name="    <Context path="" docBase="." debug="0"/>
    </Host>
    <Host name="
       <Context path="" docBase="." debug="0"/>
    </Host>
        第二步對于windows XP:
    \WINDOWS\system32\drivers\etc\hosts,此文件沒有擴展名,可以手工創建。
    127.0.0.1       localhost
    127.0.0.1      
    www.dykj.com
    127.0.0.1       www.zhip.com

    7.tomcat做web服務器的中文參數傳遞問題
        tomcat做web服務器時,通過地址欄傳中文參數時,為防止瀏覽器上的為亂碼,需在服務器server.xml中配置對應的端口中配置編碼方式即可。例如:
    <Connector port="8080"  maxThreads="150" minSpareThreads="25"
      maxSpareThreads="75" enableLookups="false" redirectPort="8443"
      acceptCount="100"  debug="0" connectionTimeout="20000"
      disableUploadTimeout="true" useBodyEncodingForURI="true"
       URIEncoding="UTF-8"/>
        中加入useBodyEncodingForURI="true" URIEncoding="UTF-8"就可以了。

     


    </script>

    posted on 2007-12-06 12:34 helloworld2008 閱讀(254) 評論(0)  編輯  收藏 所屬分類: java
    主站蜘蛛池模板: 麻豆视频免费观看| 日本片免费观看一区二区| 又黄又大又爽免费视频| 亚洲精品无码av片| 麻豆国产人免费人成免费视频| 亚洲一区二区三区久久| 日韩版码免费福利视频| 亚洲国产精品综合久久20| 久久受www免费人成_看片中文| 亚洲中文字幕人成乱码| 97在线线免费观看视频在线观看| 亚洲av无码片区一区二区三区| 国产免费不卡v片在线观看| 亚洲一区二区三区成人网站| 国产免费久久精品| 特黄特色的大片观看免费视频| 亚洲中久无码不卡永久在线观看| 久久久精品午夜免费不卡| 中文字幕亚洲第一在线| 无码区日韩特区永久免费系列 | 日韩一级视频免费观看| 国产午夜亚洲精品不卡电影| 亚洲乱码中文字幕手机在线| 成年午夜视频免费观看视频| 国产成人精品日本亚洲18图| 日韩午夜免费视频| 中文字幕手机在线免费看电影 | 中文字幕不卡免费视频| 亚洲国产一区国产亚洲| 永久免费AV无码国产网站| 亚洲av无一区二区三区| 国产成人精品日本亚洲专区61| 无码精品人妻一区二区三区免费看| 亚洲国产情侣一区二区三区| 免费一区二区三区四区五区| 99视频在线免费观看| 亚洲一区二区三区播放在线| 亚洲国产精品专区在线观看| 在线免费观看你懂的| 老外毛片免费视频播放| 亚洲人成网www|