Tomcat分為很多組件,這些組件一起協(xié)同工作。
這些組件包括: Server,Service,Connector,Engine,Host,Context,Wrapper.
這么一堆組件,看起來比較復(fù)雜,怎么去理解呢?本文主要來個top level view。
回到我們最初的對servlet容器的理解,一個servlet容器最重要的功能無非就是接受http請求,解析http請求生成request,并調(diào)用servlet,生成響應(yīng)response。那么以上工作的入口在哪里,沒錯,那就是Connector組件。先來認(rèn)識一下Connector組件。
Connector組件
Connector主要功能是Socket連接等待Http請求,創(chuàng)建javax.servlet.http.HttpServletRequest和javax.servlet.http.HttpServletResponse實例,并將其作為參數(shù)調(diào)用容器。當(dāng)然Connector并不只處理http協(xié)議的請求,支持多種協(xié)議如https,AJP/1.3等。不同的Connector代表了不同的協(xié)議,同時在不同的端口上面監(jiān)聽。這個可以再Server.xml里進(jìn)行配置。connector的工作就像下圖的前半部分:
從以上看出Connector負(fù)責(zé)接受請求和生成request(Request創(chuàng)建過程:parse header,parse cookie,parse parameter、設(shè)置encodeing等)和response。再把參數(shù)傳給容器。最后我們是要由url請求對應(yīng)的servlet的service方法來接收這兩個參數(shù),并處理生成response。那么后面的load servlet和invoke servlet的工作就交給容器來處理了,容器說起來很抽象誒,它代表什么?下面介紹一下Container。
Container組件
沒錯,容器只是一個抽象的概念,在tomcat里Engine,Host,Context,Wrapper都代表容器。它們各自的功能如下:
Engine:代表了整個Catalina servlet引擎.
Host:代表了一個具有多個應(yīng)用實例(Context)的虛擬主機(jī)(注:tomcat里默認(rèn)只有一個localhost虛擬主機(jī),所有的請求默認(rèn)都轉(zhuǎn)發(fā)給它,它的應(yīng)用實例都默認(rèn)的放在webapps目錄下面。Tomcat支持多虛擬主機(jī),可以再server.xml里面進(jìn)行配置).
Context:代表了一個應(yīng)用實例,也就是我們平常的一個web應(yīng)用。一個Context有一個或者多個wrappers.
Wrapper:代表了一個單獨的servlet.
有了Connector和Container(Engine,Host,Context,Wrapper)似乎一個servlet容器就可以工作了,那么文章一開始提到的Server和Service干啥用的呢?
Service組件
Service包含了一個Engine元素和多個Connector元素。上文提到的connector有多種,這些connector可以共享一個servlet引擎。同時分開運行。而其管理是有service來管理的。
Server組件
Server它代表了整個Servlet容器。它提供了一套啟動和停止整個系統(tǒng)的機(jī)制。而我們不用去關(guān)心內(nèi)部的原理。它包含了一個或者多個service實例。當(dāng)你啟動一個server,它把所有的內(nèi)部組件都初始化。同時它提供一個監(jiān)聽端口,時刻監(jiān)聽shutdown命令。并負(fù)責(zé)整個系統(tǒng)的stop過程。同時Server也提供了JNDI等其他java EE服務(wù)的實現(xiàn)??梢栽賡erver里初始化JNDI數(shù)據(jù)源(在server.xml里配置)。
以上包括了tomcat的全部組件,其關(guān)系可由下圖片表示:
Server.xml配置文件
關(guān)心內(nèi)部的一個Server起來的時候,它怎么知道要啟動哪些Service或Connector?在server起來的時候是通過讀取server.xml里的配置來組織和初始化整個容器,也就是說server.xml實際上就代表了一個server實例,它包含了server要在哪個端口上面監(jiān)聽shutdown,server使用哪個類?connector應(yīng)該包括哪些,各個connector的監(jiān)聽端口和協(xié)議是什么?以及有幾個host,host名稱是什么?host的base目錄在哪里?默認(rèn)的context是哪個?還有Engine、service等等一些列屬性。
下面看看一個tomcat默認(rèn)的server.xml:
<Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JasperListener" /> <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <!-- Global JNDI resources Documentation at /docs/jndi-resources-howto.html --> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> </Host> </Engine> </Service> </Server>
文章題目:Insidetomcat(二)-------Toplevelview
網(wǎng)頁鏈接:http://www.rwnh.cn/article24/chedje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、電子商務(wù)、搜索引擎優(yōu)化、關(guān)鍵詞優(yōu)化、服務(wù)器托管、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)