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

對應的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自身,一個Tomcat程序實例(instance)。
代表整個容器,是Tomcat實例的頂層元素.由org.apache.catalina.Server接口來定義。
提供完整的JVM的獨立組件,它可以包含一個或多個“Service”實例。服務器在指定的端口上監聽shutdown命令。
它的一個重要屬性就是關閉Tomcat的端口號。
測試命令:
telnet localhost 8008
輸入:SHUTDOWN
結果:關閉tomcat
屬性說明:
<Server port="8008" shutdown="SHUTDOWN">
1)className指定實現org.apache.catalina.Server接口的類.默認值為org.apache.catalina.core.StandardServer
2)port指定Tomcat監聽shutdown命令端口.終止服務器運行時,必須在Tomcat服務器所在的機器上發出shutdown命令.該屬性是必須的.
3)shutdown指定終止Tomcat服務器運行時,發給Tomcat服務器的shutdown監聽端口的字符串.該屬性必須設置
2.Service
Service由Connector和Engine組成,Engine可以對應一個或多個Connector。
Connector 主要負責對外交流,Engine主要處理Connector接受的請求,主要是處理內部事務。
是 Service 將它們連接在一起,共同負責處理所有Connector所獲得的客戶請求。
3.Connector
Connector代表與客戶程序實際交互的給件,它負責接收客戶請求,以及向客戶返回響應結果.
每個connector都有一個端口號,常用的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:設定Http協議,默認值為HTTP/1.1
4.Engine
Service中的請求處理機,接受和處理來自Connector 的請求。
5.Host
它由Host接口定義.一個Engine元素可以包含多個<Host>元素.每個<Host>的元素定義了一個虛擬主機.它包含了一個或多個Web應用.
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
appBase : 指定虛擬主機的目錄,可以指定絕對目錄,也可以指定相對于<CATALINA_HOME>的相對目錄.如果沒有此項,默認為<CATALINA_HOME>/webapps.
它將匹配請求和自己的Context的路徑,并把請求轉交給對應的Context來處理
autoDeploy:如果此項設為true,表示Tomcat服務處于運行狀態時,能夠監測appBase下的文件,如果有新有web應用加入進來,會自運發布這個WEB應用
unpackWARs:如果此項設置為true,表示把WEB應用的WAR文件先展開為開放目錄結構后再運行.如果設為false將直接運行為WAR文件
alias:指定主機別名,可以指定多個別名
deployOnStartup:如果此項設為true,表示Tomcat服務器啟動時會自動發布appBase目錄下所有的Web應用.
如果Web應用中的server.xml沒有相應的<Context>元素,將采用Tomcat默認的Context
6.Context
它由Context接口定義.是使用最頻繁的元素.每個<Context元素代表了運行在虛擬主機上的單個Web應用.一個<Host>可以包含多個<Context>元素.
Context 代表 Servlet 的 Context,它具備了 Servlet 運行的基本環境,理論上只要有 Context 就能運行 Servlet 了。簡單的 Tomcat 可以沒有 Engine 和 Host。
Context 最重要的功能就是管理它里面的 Servlet 實例,Servlet 實例在 Context 中是以 Wrapper 出現的,還有一點就是 Context 如何才能找到正確的 Servlet 來執行它呢? Tomcat5 以前是通過一個 Mapper 類來管理的,Tomcat5 以后這個功能被移到了 request 中。
<Context path="/test" reloadable="true" docBase="" />
path : 該Context的路徑名是"",故該Context是該Host的默認Context
docBase : 該Context的根目錄是webapps/mycontext/
reloadable:如果這個屬性設為true, Tomcat服務器在運行狀態下會監視在WEB-INF/classes和Web-INF/lib目錄CLASS文件的改運.如果監視到有class文件被更新,服務器自重新加載Web應用
useNaming:指定是否支持JNDI,默認值為了true
cookies指定是否通過Cookies來支持Session,默認值為true
<Context path="" docBase="mycontext" debug="0"/>
生命周期(Lifecycle)
Tomcat使用的一種“插件式(plugable)”的結構,管理這些插件的生命周期。當用戶啟動tomcat時,tomcat中的插件也會一起啟動,當關閉時也是同樣。通過Lifecycle接口:LifecycleEvent和LifecycleListener 實現的。
幾乎所有的Tomcat組件都實現了Lifecycle接口,主要的控制組件都有LifecycleSuport對象,它們使用這個對象來管理其中的所有子Lifecycle對象。使用LifecycleSupport對象,當頂層對象調用start()方法時,它就會調用它的子組件的start()方法,子組件的子組件又會調用start()方法。
LifecycleListener接口可以被添加到任何層次的Tomcat容器 (Server, Service, Engine, Host, or Context),在Server這個級別,默認的Listener有三個。用戶可以定義自己的Listener,不過需要將其在server.xml或context.xml中添加配置。用戶自定義的Listener需要繼承LifecycleListene接口。