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

對應(yīng)的server.xml
1
<Server port="8008" shutdown="SHUTDOWN">
2
<Service name="Catalina">
3
<Connector port="8080" protocol="HTTP/1.1"
4
connectionTimeout="20000"
5
redirectPort="8443" URIEncoding="utf-8" />
6
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
7
<Engine name="Catalina" defaultHost="localhost">
8
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
9
resourceName="UserDatabase"/>
10
<Host name="localhost" appBase="webapps"
11
unpackWARs="true" autoDeploy="true"
12
xmlValidation="false" xmlNamespaceAware="false">
13
<Context path="/test" reloadable="true" docBase="" />
14
</Host>
15
</Engine>
16
</Service>
17
</Server> l
各部分說明:
1.Server
Server就是Tomcat自身,一個(gè)Tomcat程序?qū)嵗╥nstance)。
代表整個(gè)容器,是Tomcat實(shí)例的頂層元素.由org.apache.catalina.Server接口來定義。
提供完整的JVM的獨(dú)立組件,它可以包含一個(gè)或多個(gè)“Service”實(shí)例。服務(wù)器在指定的端口上監(jiān)聽shutdown命令。
它的一個(gè)重要屬性就是關(guān)閉Tomcat的端口號。
測試命令:
telnet localhost 8008
輸入:SHUTDOWN
結(jié)果:關(guān)閉tomcat
屬性說明:
<Server port="8008" shutdown="SHUTDOWN">
1)className指定實(shí)現(xiàn)org.apache.catalina.Server接口的類.默認(rèn)值為org.apache.catalina.core.StandardServer
2)port指定Tomcat監(jiān)聽shutdown命令端口.終止服務(wù)器運(yùn)行時(shí),必須在Tomcat服務(wù)器所在的機(jī)器上發(fā)出shutdown命令.該屬性是必須的.
3)shutdown指定終止Tomcat服務(wù)器運(yùn)行時(shí),發(fā)給Tomcat服務(wù)器的shutdown監(jiān)聽端口的字符串.該屬性必須設(shè)置
2.Service
Service由Connector和Engine組成,Engine可以對應(yīng)一個(gè)或多個(gè)Connector。
Connector 主要負(fù)責(zé)對外交流,Engine主要處理Connector接受的請求,主要是處理內(nèi)部事務(wù)。
是 Service 將它們連接在一起,共同負(fù)責(zé)處理所有Connector所獲得的客戶請求。
3.Connector
Connector代表與客戶程序?qū)嶋H交互的給件,它負(fù)責(zé)接收客戶請求,以及向客戶返回響應(yīng)結(jié)果.
每個(gè)connector都有一個(gè)端口號,常用的Connector有兩種,一種是HTTP Connector用來接收http請求,另一種是AJP Connect
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
port : 在端口號8080處偵聽來自客戶browser的HTTP1.1請求.如果把8080改成80,則只要輸入 http://localhost/ 即可
protocol:設(shè)定Http協(xié)議,默認(rèn)值為HTTP/1.1
4.Engine
Service中的請求處理機(jī),接受和處理來自Connector 的請求。
5.Host
它由Host接口定義.一個(gè)Engine元素可以包含多個(gè)<Host>元素.每個(gè)<Host>的元素定義了一個(gè)虛擬主機(jī).它包含了一個(gè)或多個(gè)Web應(yīng)用.
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
appBase : 指定虛擬主機(jī)的目錄,可以指定絕對目錄,也可以指定相對于<CATALINA_HOME>的相對目錄.如果沒有此項(xiàng),默認(rèn)為<CATALINA_HOME>/webapps.
它將匹配請求和自己的Context的路徑,并把請求轉(zhuǎn)交給對應(yīng)的Context來處理
autoDeploy:如果此項(xiàng)設(shè)為true,表示Tomcat服務(wù)處于運(yùn)行狀態(tài)時(shí),能夠監(jiān)測appBase下的文件,如果有新有web應(yīng)用加入進(jìn)來,會(huì)自運(yùn)發(fā)布這個(gè)WEB應(yīng)用
unpackWARs:如果此項(xiàng)設(shè)置為true,表示把WEB應(yīng)用的WAR文件先展開為開放目錄結(jié)構(gòu)后再運(yùn)行.如果設(shè)為false將直接運(yùn)行為WAR文件
alias:指定主機(jī)別名,可以指定多個(gè)別名
deployOnStartup:如果此項(xiàng)設(shè)為true,表示Tomcat服務(wù)器啟動(dòng)時(shí)會(huì)自動(dòng)發(fā)布appBase目錄下所有的Web應(yīng)用.
如果Web應(yīng)用中的server.xml沒有相應(yīng)的<Context>元素,將采用Tomcat默認(rèn)的Context
6.Context
它由Context接口定義.是使用最頻繁的元素.每個(gè)<Context元素代表了運(yùn)行在虛擬主機(jī)上的單個(gè)Web應(yīng)用.一個(gè)<Host>可以包含多個(gè)<Context>元素.
Context 代表 Servlet 的 Context,它具備了 Servlet 運(yùn)行的基本環(huán)境,理論上只要有 Context 就能運(yùn)行 Servlet 了。簡單的 Tomcat 可以沒有 Engine 和 Host。
Context 最重要的功能就是管理它里面的 Servlet 實(shí)例,Servlet 實(shí)例在 Context 中是以 Wrapper 出現(xiàn)的,還有一點(diǎn)就是 Context 如何才能找到正確的 Servlet 來執(zhí)行它呢? Tomcat5 以前是通過一個(gè) Mapper 類來管理的,Tomcat5 以后這個(gè)功能被移到了 request 中。
<Context path="/test" reloadable="true" docBase="" />
path : 該Context的路徑名是"",故該Context是該Host的默認(rèn)Context
docBase : 該Context的根目錄是webapps/mycontext/
reloadable:如果這個(gè)屬性設(shè)為true, Tomcat服務(wù)器在運(yùn)行狀態(tài)下會(huì)監(jiān)視在WEB-INF/classes和Web-INF/lib目錄CLASS文件的改運(yùn).如果監(jiān)視到有class文件被更新,服務(wù)器自重新加載Web應(yīng)用
useNaming:指定是否支持JNDI,默認(rèn)值為了true
cookies指定是否通過Cookies來支持Session,默認(rèn)值為true
<Context path="" docBase="mycontext" debug="0"/>
生命周期(Lifecycle)
Tomcat使用的一種“插件式(plugable)”的結(jié)構(gòu),管理這些插件的生命周期。當(dāng)用戶啟動(dòng)tomcat時(shí),tomcat中的插件也會(huì)一起啟動(dòng),當(dāng)關(guān)閉時(shí)也是同樣。通過Lifecycle接口:LifecycleEvent和LifecycleListener 實(shí)現(xiàn)的。
幾乎所有的Tomcat組件都實(shí)現(xiàn)了Lifecycle接口,主要的控制組件都有LifecycleSuport對象,它們使用這個(gè)對象來管理其中的所有子Lifecycle對象。使用LifecycleSupport對象,當(dāng)頂層對象調(diào)用start()方法時(shí),它就會(huì)調(diào)用它的子組件的start()方法,子組件的子組件又會(huì)調(diào)用start()方法。
LifecycleListener接口可以被添加到任何層次的Tomcat容器 (Server, Service, Engine, Host, or Context),在Server這個(gè)級別,默認(rèn)的Listener有三個(gè)。用戶可以定義自己的Listener,不過需要將其在server.xml或context.xml中添加配置。用戶自定義的Listener需要繼承LifecycleListene接口。