Tomcat6結(jié)構分析
Tomcat6結(jié)構分析tomcat在實際開發(fā)中大量使用,對其結(jié)構不了解的話在配置使用過程中容易出現(xiàn)各種奇怪的問題。
Server.xml在tomcat處于核心地位。當Tomcat啟動時,Apache Commons Digester就會讀取這份配置文件。
XML結(jié)構的本質(zhì)是嵌套式的機構,Tomcat自身也按這種結(jié)構設計。
從這份示例server.xml文檔也可以看出,Tomcat的結(jié)構和XML的結(jié)構是多么的一致。因此,要想弄清楚Tomcat的結(jié)構,最快捷的方法就是閱讀配置文件。
tomcat結(jié)構如圖:

對應的server.xml

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

各部分說明:
1.Server
Server就是Tomcat自身,一個Tomcat程序?qū)嵗╥nstance)。
代表整個容器,是Tomcat實例的頂層元素.由org.apache.catalina.Server接口來定義。
提供完整的JVM的獨立組件,它可以包含一個或多個“Service”實例。服務器在指定的端口上監(jiān)聽shutdown命令。
它的一個重要屬性就是關閉Tomcat的端口號。
測試命令:
telnet localhost 8008
輸入:SHUTDOWN
結(jié)果:關閉tomcat
屬性說明:
<Server port="8008" shutdown="SHUTDOWN">
1)className指定實現(xiàn)org.apache.catalina.Server接口的類.默認值為org.apache.catalina.core.StandardServer
2)port指定Tomcat監(jiān)聽shutdown命令端口.終止服務器運行時,必須在Tomcat服務器所在的機器上發(fā)出shutdown命令.該屬性是必須的.
3)shutdown指定終止Tomcat服務器運行時,發(fā)給Tomcat服務器的shutdown監(jiān)聽端口的字符串.該屬性必須設置
Service由Connector和Engine組成,Engine可以對應一個或多個Connector。
Connector 主要負責對外交流,Engine主要處理Connector接受的請求,主要是處理內(nèi)部事務。
是 Service 將它們連接在一起,共同負責處理所有Connector所獲得的客戶請求。
3.Connector
Connector代表與客戶程序?qū)嶋H交互的給件,它負責接收客戶請求,以及向客戶返回響應結(jié)果.
每個connector都有一個端口號,常用的Connector有兩種,一種是HTTP Connector用來接收http請求,另一種是AJP Connect




port : 在端口號8080處偵聽來自客戶browser的HTTP1.1請求.如果把8080改成80,則只要輸入 http://localhost/ 即可
protocol:設定Http協(xié)議,默認值為HTTP/1.1
4.Engine
Service中的請求處理機,接受和處理來自Connector 的請求。
5.Host
它由Host接口定義.一個Engine元素可以包含多個<Host>元素.每個<Host>的元素定義了一個虛擬主機.它包含了一個或多個Web應用.



appBase : 指定虛擬主機的目錄,可以指定絕對目錄,也可以指定相對于<CATALINA_HOME>的相對目錄.如果沒有此項,默認為<CATALINA_HOME>/webapps.
它將匹配請求和自己的Context的路徑,并把請求轉(zhuǎn)交給對應的Context來處理
autoDeploy:如果此項設為true,表示Tomcat服務處于運行狀態(tài)時,能夠監(jiān)測appBase下的文件,如果有新有web應用加入進來,會自運發(fā)布這個WEB應用
unpackWARs:如果此項設置為true,表示把WEB應用的WAR文件先展開為開放目錄結(jié)構后再運行.如果設為false將直接運行為WAR文件
alias:指定主機別名,可以指定多個別名
deployOnStartup:如果此項設為true,表示Tomcat服務器啟動時會自動發(fā)布appBase目錄下所有的Web應用.
如果Web應用中的server.xml沒有相應的<Context>元素,將采用Tomcat默認的Context
6.Context
它由Context接口定義.是使用最頻繁的元素.每個<Context元素代表了運行在虛擬主機上的單個Web應用.一個<Host>可以包含多個<Context>元素.
Context 代表 Servlet 的 Context,它具備了 Servlet 運行的基本環(huán)境,理論上只要有 Context 就能運行 Servlet 了。簡單的 Tomcat 可以沒有 Engine 和 Host。
Context 最重要的功能就是管理它里面的 Servlet 實例,Servlet 實例在 Context 中是以 Wrapper 出現(xiàn)的,還有一點就是 Context 如何才能找到正確的 Servlet 來執(zhí)行它呢? Tomcat5 以前是通過一個 Mapper 類來管理的,Tomcat5 以后這個功能被移到了 request 中。

path : 該Context的路徑名是"",故該Context是該Host的默認Context
docBase : 該Context的根目錄是webapps/mycontext/
reloadable:如果這個屬性設為true, Tomcat服務器在運行狀態(tài)下會監(jiān)視在WEB-INF/classes和Web-INF/lib目錄CLASS文件的改運.如果監(jiān)視到有class文件被更新,服務器自重新加載Web應用
useNaming:指定是否支持JNDI,默認值為了true
cookies指定是否通過Cookies來支持Session,默認值為true
<Context path="" docBase="mycontext" debug="0"/>
生命周期(Lifecycle)
Tomcat使用的一種“插件式(plugable)”的結(jié)構,管理這些插件的生命周期。當用戶啟動tomcat時,tomcat中的插件也會一起啟動,當關閉時也是同樣。通過Lifecycle接口:LifecycleEvent和LifecycleListener 實現(xiàn)的。
幾乎所有的Tomcat組件都實現(xiàn)了Lifecycle接口,主要的控制組件都有LifecycleSuport對象,它們使用這個對象來管理其中的所有子Lifecycle對象。使用LifecycleSupport對象,當頂層對象調(diào)用start()方法時,它就會調(diào)用它的子組件的start()方法,子組件的子組件又會調(diào)用start()方法。
LifecycleListener接口可以被添加到任何層次的Tomcat容器 (Server, Service, Engine, Host, or Context),在Server這個級別,默認的Listener有三個。用戶可以定義自己的Listener,不過需要將其在server.xml或context.xml中添加配置。用戶自定義的Listener需要繼承LifecycleListene接口。