轉(zhuǎn)自: http://bbs.163jsp.com/posts/list/607.html
Apache Tomcat 是一款非常著名的開源 Servlet/JSP 容器,被用做 Java Servlet 和 JavaServer Pages 技術(shù)的官方參考實現(xiàn)。如果您要了解這兩種技術(shù)的細(xì)節(jié)可以查閱參考資料。
讓我們先來瀏覽一下 Tomcat 體系結(jié)構(gòu)中的六個主要概念:
● Server
● Service
● Engine
● Host
● Connector
● Context
由于Tomcat體系結(jié)構(gòu)的內(nèi)容非常豐富,所以本文非常長。因此我們盡量的使每一部分盡可能自成一體,使您可以獨立閱讀。如果您不是想全面了解Tomcat 的體系結(jié)構(gòu),只是想解決某一部分的具體問題,那么我們建議您使用目錄導(dǎo)航到相關(guān)的內(nèi)容,而不必在其它的內(nèi)容上花費寶貴的時間。
=============================================================================
Server
Server代表整個容器(container)。它可以包含一個或多個Service,還可以包含一個GlobalNamingResources。
值得注意的是在標(biāo)準(zhǔn)的Server接口中沒有包括Lifecycle接口,但是在標(biāo)準(zhǔn)實現(xiàn) org.apache.catalina.core.StandardServer中卻實現(xiàn)了Lifecycle這個接口,這使得我們可以為Tomcat 的標(biāo)準(zhǔn)實現(xiàn)設(shè)置Listener。一般的方法是在conf/server.xml文件中加入:
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.solol.listener.XXXLifecycleListener" />
<Listener className="org.solol.listener.XXXLifecycleListener" />
:
:
:
</Server>
其中的XXXLifecycleListener為您自定義的LifecycleListener,而且必須要實現(xiàn)LifecycleListener接口。您可以在這里設(shè)置多個LifecycleListener,但要使用不同的名字。
由于在Tomcat的官方文檔中沒有顯著的說明,所以這種使用Listener的方式?jīng)]有體現(xiàn)在稍后給出的 體系結(jié)構(gòu)圖 中。
Server支持className,port和shutdown三個公共屬性,而標(biāo)準(zhǔn)實現(xiàn)org.apache.catalina.core.StandardServer還可能支持一些擴(kuò)展屬性。詳細(xì)的內(nèi)容您可以查閱 這里 。
您可以通過稍后給出的 體系結(jié)構(gòu)圖 了解在整個Tomcat體系結(jié)構(gòu)中Server所處的位置。
=============================================================================
Service
Service中可以含有一個或多個Connector,但只能含有一個Engine。這使得不同的Connector可以共享同一個Engine。同一個Server中的多個Service之間沒有相關(guān)性。
值得注意的是在標(biāo)準(zhǔn)的Service接口中沒有包括Lifecycle接口,但是在標(biāo)準(zhǔn)實現(xiàn) org.apache.catalina.core.StandardService中卻實現(xiàn)了Lifecycle這個接口,這使得我們可以為 Tomcat的標(biāo)準(zhǔn)實現(xiàn)設(shè)置Listener。
由于在Tomcat的官方文檔中沒有顯著的說明,所以這種使用Listener的方式?jīng)]有體現(xiàn)在稍后給出的 體系結(jié)構(gòu)圖 中。
Service支持className和name兩個公共屬性,而標(biāo)準(zhǔn)實現(xiàn)org.apache.catalina.core.StandardService還可能支持一些擴(kuò)展屬性。詳細(xì)的內(nèi)容您可以查閱 這里 。
您可以通過稍后給出的 體系結(jié)構(gòu)圖 了解在整個Tomcat體系結(jié)構(gòu)中Service所處的位置。
=============================================================================
Engine
Engine負(fù)責(zé)接收和處理來自它所屬的Service中的所有Connector的請求。
Engine 支持backgroundProcessorDelay、className、defaultHost、jvmRoute和name五個公共屬性,而標(biāo)準(zhǔn)實現(xiàn)org.apache.catalina.core.StandardEngine還可能支持一些擴(kuò)展屬性。詳細(xì)的內(nèi)容您可以查閱 這里 。
您可以通過稍后給出的 體系結(jié)構(gòu)圖 了解在整個Tomcat體系結(jié)構(gòu)中Engine所處的位置。
從圖中可以看出Engine右邊有四個不同顏色的小方塊,它們表示Engine所支持的四個不同的特性。相同顏色的小方塊可能也會出現(xiàn)在其它的地方,這表示在那里也支持相同的或相似的特性。每種特性的具體描述可以在文中的Special Features中找到。
從圖中可以看出Engine下邊有一個紅色的圓角矩形,它們表示Engine所支持的一個內(nèi)嵌組件。相同顏色的圓角矩形可能也會出現(xiàn)在其它的地方,這表示在那里也支持相同的或相似的內(nèi)嵌組件。每種內(nèi)嵌組件的具體描述可以在文中的Nested Components中找到。
=============================================================================
Host
Host表示一個虛擬主機,并和一個服務(wù)器的網(wǎng)絡(luò)名關(guān)聯(lián)。注意Engine中必須有一個Host的名字和Engine的defaultHost屬性匹配。
有時候,網(wǎng)絡(luò)管理員可能希望將多個網(wǎng)絡(luò)名關(guān)聯(lián)到一個虛擬主機,這可以通過下文介紹的Host Name Aliases特性完成。
Host 支持appBase、autoDeploy、backgroundProcessorDelay、className、deployOnStartup和 name六個公共屬性,而標(biāo)準(zhǔn)實現(xiàn)org.apache.catalina.core.StandardHost還可能支持一些擴(kuò)展屬性。詳細(xì)的內(nèi)容您可以查閱這里。
您可以通過稍后給出的 體系結(jié)構(gòu)圖 了解在整個Tomcat體系結(jié)構(gòu)中Host所處的位置。
從圖中可以看出Host右邊有八個不同顏色的小方塊,它們表示Host所支持的八個不同的特性。相同顏色的小方塊可能也會出現(xiàn)在其它的地方,這表示在那里也支持相同的或相似的特性。每種特性的具體描述可以在文中的Special Features中找到。
從圖中可以看出Host下邊有一個紅色的圓角矩形,它們表示Host所支持的一個內(nèi)嵌組件。相同顏色的圓角矩形可能也會出現(xiàn)在其它的地方,這表示在那里也支持相同的或相似的內(nèi)嵌組件。每種內(nèi)嵌組件的具體描述可以在文中的Nested Components中找到。
=============================================================================
Connector
Connector負(fù)責(zé)接收來自客戶端(Client)的請求。比較常見的兩個是 HTTP Connector 和 AJP Connector 。
您可以通過稍后給出的 體系結(jié)構(gòu)圖 了解在整個Tomcat體系結(jié)構(gòu)中Connector所處的位置。
=============================================================================
Context
Context表示在虛擬主機中運行的web應(yīng)用程序。一個虛擬主機中能夠運行多個Context,它們通過各自的Context Path進(jìn)行相互區(qū)分。如果Context Path為"",那么該web應(yīng)用為該虛擬主機的默認(rèn)的web應(yīng)用。
目前可以通過四種方式將Context加入Host:
● $CATALINA_HOME/conf/context.xml,其中Context元素中的信息會被所有web應(yīng)用程序加載
● $CATALINA_HOME/conf/[enginename]/[hostname]/context.xml.default,其中Context元素中的信息會被hostname主機下的所有web應(yīng)用程序加載
● $CATALINA_HOME/conf/[enginename]/[hostname]/目錄中所有以.xml為擴(kuò)展名的文件,其中Context元素中的信息會被hostname主機下的所有web應(yīng)用程序加載
● 如果通過上面的步驟沒有找到,那么最后要從web應(yīng)用程序的/META-INF/context.xml目錄中查找
Context 支持backgroundProcessorDelay、className、cookies、crossContext、docBase、 override、privileged、path、reloadable和wrapperClass十個公共屬性,而標(biāo)準(zhǔn)實現(xiàn) org.apache.catalina.core.StandardContext還可能支持一些擴(kuò)展屬性。詳細(xì)的內(nèi)容您可以查閱這里。
您可以通過稍后給出的 體系結(jié)構(gòu)圖 了解在整個Tomcat體系結(jié)構(gòu)中Context所處的位置。
從圖中可以看出Context右邊有十個不同顏色的小方塊,它們表示Context所支持的十個不同的特性。相同顏色的小方塊可能也會出現(xiàn)在其它的地方,這表示在那里也支持相同的或相似的特性。每種特性的具體描述可以在文中的Special Features中找到。
從圖中可以看出Context下邊有五個不同顏色的圓角矩形,它們表示Context所支持的五個內(nèi)嵌組件。相同顏色的圓角矩形可能也會出現(xiàn)在其它的地方,這表示在那里也支持相同的或相似的內(nèi)嵌組件。每種內(nèi)嵌組件的具體描述可以在文中的Nested Components中找到。
=============================================================================
體系結(jié)構(gòu)圖
=============================================================================
Nested Components
=============================================================================
GlobalNamingResources
GlobalNamingResources 組件為 Server 定義全局 JNDI 資源。這些資源出現(xiàn)在 Server 的全局 JNDI 資源上下文中。這個上下文和每個 web 應(yīng)用程序的 JNDI 上下文不同。在全局 JNDI 上下文中定義的資源在每個 web 應(yīng)用程序的 JNDI 上下文中不可見,但是可以通過 Resource Links 來改變這種可見性。如果您要了解在 Tomcat 中如何使用 JNDI 資源可以查閱參考 http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html。
從前面給出的 體系結(jié)構(gòu)圖 中可以看出GlobalNamingResources右邊有四個不同顏色的小方塊,它們表示GlobalNamingResources所支持的四個不同的特性。相同顏色的小方塊可能也會出現(xiàn)在其它的地方,這表示在那里也支持相同的或相似的特性。每種特性的具體描述可以在文中的Special Features中找到。
Realm
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,Realm組件在Engine、Host和Context中都有支持。
Realm 是一個"數(shù)據(jù)庫"存儲著用戶名、密碼和角色信息。通過自定義Realm可以將Catalina集成到其它的環(huán)境。Engine、Host和Context 中的Realm可以被較低級別的容器繼承,即Host繼承Engine的Realm,Context繼承Host的Realm,除非我們顯示的禁止這種繼承。
Realm支持className一個公共屬性。Tomcat提供了多個實現(xiàn):
● org.apache.catalina.realm.JDBCRealm
● org.apache.catalina.realm.DataSourceRealm
● org.apache.catalina.realm.JNDIRealm
● org.apache.catalina.realm.MemoryRealm
如果您要了解這些Realm的更多信息,可以查閱 這里 。
Loader
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,Loader組件只在Context中都有支持。
Loader是web應(yīng)用程序的類裝載器。必須有一個類裝載器按照Servlet Specification的要求從如下的位置裝載類:
● 從web應(yīng)用程序的/WEB-INF/classes目錄裝載
● 從web應(yīng)用程序的/WEB-INF/lib目錄中的jar文件中裝載
● 從Catalina中裝載對于所有web應(yīng)用可見的資源
Loader元素應(yīng)該嵌入到Context元素中,如果沒有設(shè)置那么會自動創(chuàng)建一個默認(rèn)的Loader。如果想更深入的了解Catalina實現(xiàn)的Loader可以查閱參考資料。
Loader支持className、delegate和reloadable三個公共屬性,而標(biāo)準(zhǔn)實現(xiàn)org.apache.catalina.loader.WebappLoader還可能支持一些擴(kuò)展屬性。詳細(xì)的內(nèi)容您可以查閱 這里 。
Manager
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,Manager組件只在Context中有支持。
Manager是session管理器(session manager),負(fù)責(zé)session的創(chuàng)建和維護(hù)。
Manager元素應(yīng)該嵌入到Context元素中,如果沒有設(shè)置那么會自動創(chuàng)建一個默認(rèn)的Manager。
Manager 支持className和distributable兩個公共屬性,而標(biāo)準(zhǔn)實現(xiàn) org.apache.catalina.session.StandardManager和 org.apache.catalina.session.PersistentManager還可能支持一些擴(kuò)展屬性。詳細(xì)的內(nèi)容您可以查閱 這里 。
Resources
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,Resources組件只在Context中有支持。
Resources表示web應(yīng)用程序的靜態(tài)資源。這使得我們有可能實現(xiàn)non-filesystem based Resources。
Resources元素應(yīng)該嵌入到Context元素中,如果沒有設(shè)置那么會自動創(chuàng)建一個默認(rèn)的基于文件系統(tǒng)的Resources。
Resources支持className一個公共屬性,而標(biāo)準(zhǔn)實現(xiàn)org.apache.naming.resources.FileDirContext還可能支持一些擴(kuò)展屬性。詳細(xì)的內(nèi)容您可以查閱 這里 。
WatchedResource
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,WatchedResource組件只在Context中都有支持。
WatchedResource用來告知Auto Deployer那些靜態(tài)資源的更新需要被監(jiān)控。如果被監(jiān)控的資源被更新了那么該資源所對應(yīng)的web應(yīng)用將會被重新裝載。這個元素的內(nèi)容必須是一個String。
=============================================================================
Special Features
=============================================================================
Logging
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,Logging特性在Engine、Host和Context中都有支持。這個特性使得我們可以區(qū)分日志記錄的具體來源。
在Engine、Host和Context中的日志類別分別為:
● org.apache.catalina.core.ContainerBase.[enginename]
● org.apache.catalina.core.ContainerBase.[enginename].[hostname]
● org.apache.catalina.core.ContainerBase.[enginename].[hostname].[path]
其中中括號([])中為具體的名稱。
Logging特性的實現(xiàn)是通過org.apache.catalina.core.ContainerBase來完成的。
Access Logs
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,Access Logs特性在Engine、Host和Context中都有支持。
● Engine中的Access Logs記錄所有Engine處理的請求的訪問日志
● Host中的Access Logs記錄所有Host處理的請求的訪問日志
● Context中的Access Logs記錄所有Context處理的請求的訪問日志
一般的配置方法是在conf/server.xml文件的相關(guān)元素中加入:
<Engine ...>
...
<Valve className="org.apache.catalina.valves.AccessLogValve"
prefix="catalina_access_log." suffix=".txt" pattern="common"/>
...
</Engine>
上面的<Engine>,在Host中要被換成<Host>,在Context中要被換成<Context>。
Access Logs特性的實現(xiàn)是通過Tomcat的Value框架來完成的。
如果您要了解Access Log Valve設(shè)置的更多信息,可以查閱 這里 。
Lifecycle Listeners
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,Lifecycle Listeners特性在Engine、Host和Context中都有支持。這個特性使得我們可以方便的進(jìn)行生命周期的管理。
值得一提的是在Tomcat的標(biāo)準(zhǔn)實現(xiàn)中Server和Service也支持生命周期的管理,但是在官方文檔中沒有顯著的說明,所以沒有在圖中體現(xiàn)出來。細(xì)節(jié)可以查閱Server和Service部分。
● Engine中的Lifecycle Listeners監(jiān)聽該Engine的生命周期事件(Eifecycle Event)
● Host中的Lifecycle Listeners監(jiān)聽該Host的生命周期事件(Eifecycle Event)
● Context中的Lifecycle Listeners監(jiān)聽該Context的生命周期事件(Eifecycle Event)
一般的配置方法是在conf/server.xml文件的相關(guān)元素中加入:
<Engine ...>
...
<Listener className="com.mycompany.mypackage.MyListener" ... >
...
</Engine>
上面的<Engine>,在Host中要被換成<Host>,在Context中要被換成<Context>。
另外,可以通過<Listener>元素為listener添加屬性。
注意和Container Event區(qū)別。
Request Filters
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,Request Filters特性在Engine、Host和Context中都有支持。
● Engine中的Request Filters過濾所有Engine處理的請求
● Host中的Request Filters過濾所有Host處理的請求
● Context中的Request Filters過濾所有Context處理的請求
一般的配置方法是在conf/server.xml文件的相關(guān)元素中加入:
<Engine ...>
...
<Valve className="org.apache.catalina.valves.RemoteHostValve"
allow="*.mycompany.com,www.yourcompany.com"/>
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
deny="192.168.1.*"/>
...
</Engine/>
上面的<Engine>,在Host中要被換成<Host>,在Context中要被換成<Context>。
Request Filters特性的實現(xiàn)是通過Tomcat的Value框架來完成的。
如果您要了解Remote Address Filter設(shè)置的更多信息,可以查閱 這里 。
如果您要了解Remote Host Filter設(shè)置的更多信息,可以查閱 這里 。
Automatic Application Deployment
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,Automatic Application Deployment特性只在Host中都有支持。
如果使用Host的標(biāo)準(zhǔn)實現(xiàn),同時deployOnStartup屬性值為true(這是默認(rèn)值),那么Catalina在首次啟動時會自動完成下面的工作:
● $CATALINA_HOME/conf/[engine_name]/[host_name]目錄下的所有XML文件都被假定含有<Context>元素。
● appBase 目錄下的所有沒有展開的war文件(沒有展開的意思是沒有和war文件名不包括.war擴(kuò)展名對應(yīng)的目錄存在)會被自動展開,除非unpackWARs屬性值為false。如果重新部署更新的war文件,在重起Tomcat之前要刪除先前展開的目錄(如果autoDeploy屬性值為true那么只要刪除先前展開的目錄更新后的war文件就會自動展開)。
● 對于appBase中含有/WEB-INF/web.xml文件的任何子目錄都會自動產(chǎn)生一個Context,不管該子目錄是否在 conf/server.xml文件中出現(xiàn)過。這個新產(chǎn)生的Context將會根據(jù)DefaultContext的屬性值進(jìn)行設(shè)置,其context path為“/目錄名”。如果目錄名為ROOT,那么context path為“”。
因此要使用上面的規(guī)則需要將XML設(shè)置文件拷貝到$CATALINA_HOME/conf/[engine_name]/[host_name]目錄下或?qū)ar文件和含有web應(yīng)用的目錄拷貝到appBase目錄下。
自動部署(Auto Deployer)也會跟蹤如下web應(yīng)用程序的變化:
● 更新WEB-INF/web.xml文件將會使web應(yīng)用程序重新加載
● 更新已展開的war文件會使web應(yīng)用程序卸載(undeploy)(同時移除先前展開的目錄)并重新部署(deployment)
● 更新XML設(shè)置文件會使web應(yīng)用程序卸載(undeploy)(不移除任何展開的目錄)并重新部署(deployment)
在使用自動部署的時候XML設(shè)置文件中的docBase要指向appBase目錄之外。否則部署將很困難或應(yīng)用程序會被部署兩次。
如果要顯示的定義context,那么需要關(guān)閉自動部署。否則相應(yīng)的context將會部署兩次,這可能會有問題。
Host Name Aliases
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,Host Name Aliases特性只在Host中都有支持。
在一些時候,網(wǎng)絡(luò)管理員會將多個網(wǎng)絡(luò)名(在DNS服務(wù)器中)解析到同一個服務(wù)器。通常每一個網(wǎng)絡(luò)名會對應(yīng)到一個Host。不過有時候需要將多個網(wǎng)絡(luò)名對應(yīng)到一個Host,Host Name Aliases用來完成這個目標(biāo)。
一般的配置方法是在conf/server.xml文件的相關(guān)元素中加入:
<Host name="www.mycompany.com" ...>
...
<Alias>mycompany.com</Alias>
...
</Host>
<Host>元素中可以嵌入一個或多個<Alias>元素。
Single Sign On
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,Single Sign On特性只在Host中都有支持。
在一些時候,特別是在Portal環(huán)境下,可能會希望當(dāng)用戶訪問一個虛擬主機下的多個web應(yīng)用時只登陸一次,即所謂的單點登陸。
一般的配置方法是在conf/server.xml文件的相關(guān)元素中加入:
<Host name="localhost" ...>
...
<Valve className="org.apache.catalina.authenticator.SingleSignOn"
debug="0"/>
...
</Host>
Single Sign On操作遵循下面的規(guī)則:
● 該虛擬主機下的所有Web應(yīng)用程序必須共享同一個Realm。在實踐中通常通過為Host或(對應(yīng)的Engine)嵌入Realm而不是為每一個Context嵌入相同的Realm來實現(xiàn)。
● 在用戶訪問該虛擬主機下的所有Web應(yīng)用程序中的非保護(hù)資源時不需要驗證。
● 在用戶訪問該虛擬主機下的所有Web應(yīng)用程序中的保護(hù)資源時需要驗證。
● 一旦被驗證,就會對該虛擬主機下的所有Web應(yīng)用程序有效,而不用每個應(yīng)用程序單獨驗證。
● 如果用戶從一個Web應(yīng)用中退出,那么所有Web應(yīng)用程序中的session都會失效。
● 使用SSO需要客戶環(huán)境支持cookies。
Single Sign On特性的實現(xiàn)是通過Tomcat的Value框架來完成的。
如果您要了解Single Sign On設(shè)置的更多信息,可以查閱 這里 。
User Web Applications
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,User Web Applications特性只在Host中都有支持。
許多Web服務(wù)器都可以處理如下形式的請求:
http://www.mycompany.com:8080/~craigmcc
其中craigmcc為系統(tǒng)的一位用戶名。具體的處理過程和操作系統(tǒng)相關(guān)。
在類Unix或Linux等操作系統(tǒng)下配置方法如下:
<Host name="localhost" ...>
...
<Listener className="org.apache.catalina.startup.UserConfig"
directoryName="public_html"
userClass="org.apache.catalina.startup.PasswdUserDatabase"/>
...
</Host>
在Windows等操作系統(tǒng)下配置方法如下:
<Host name="localhost" ...>
...
<Listener className="org.apache.catalina.startup.UserConfig"
directoryName="public_html"
homeBase="c:\Homes"
userClass="org.apache.catalina.startup.HomesUserDatabase"/>
...
</Host>
這兩種配置最主要的區(qū)別就是發(fā)現(xiàn)用戶和為用戶匹配路徑。PasswdUserDatabase依據(jù)/etc/passwd發(fā)現(xiàn)用戶而HomesUserDatabase依據(jù)homeBase="c:\Homes"發(fā)現(xiàn)用戶。
User Web Applications是通過Listener(org.apache.catalina.startup.UserConfig)的方式實現(xiàn)的。即在Host啟動時該Listener會被執(zhí)行,它會為每一個發(fā)現(xiàn)的用戶構(gòu)建對應(yīng)Context。
使用User Web Applications時需要考慮以下的一些問題:
● 依據(jù)DefaultContext來設(shè)置為每一個用戶建立Context
● 可以使用多個Listener元素(在這么做之前您最好查閱一下UserConfig)
● 用戶所對應(yīng)的目錄應(yīng)該具有讀寫權(quán)限
Automatic Context Configuration
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,Automatic Context Configuration特性只在Context中都有支持。
如果使用標(biāo)準(zhǔn)的Context實現(xiàn),當(dāng)Catalina啟動或Web應(yīng)用裝載時,會按如下的步驟自動進(jìn)行設(shè)置:
● 如果沒有指定Loader元素,那么一個標(biāo)準(zhǔn)的Loader將會被設(shè)置
● 如果沒有指定Manager元素,那么一個標(biāo)準(zhǔn)的Manager將會被設(shè)置
● 如果沒有指定Resources元素,那么一個標(biāo)準(zhǔn)的Resources將會被設(shè)置
● 處理conf/web.xml文件
● 處理/WEB-INF/web.xml文件
● 如果設(shè)置了security constraints,那么一個對應(yīng)的Authenticator會被創(chuàng)建
Context Parameters
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,Context Parameters特性只在Context中有支持。
如下的兩種配置等價,都是為Web配置初始參數(shù):
<Context ...>
...
<Parameter name="companyName" value="My Company, Incorporated" override="false"/>
...
</Context>
<context-param>
<param-name>companyName</param-name>
<param-value>My Company, Incorporated</param-value>
</context-param>
Environment Entries
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,Environment Entries特性在GlobalNamingResources和Context中都有支持。
如下的兩種配置等價,都是為配置environment entry resources:
<GlobalNamingResources ...>
...
<Environment name="maxExemptions" value="10" type="java.lang.Integer" override="false"/>
...
</GlobalNamingResources>
<env-entry>
<env-entry-name>maxExemptions</param-name>
<env-entry-value>10</env-entry-value>
<env-entry-type>java.lang.Integer</env-entry-type>
</env-entry>
這里使用GlobalNamingResources表示environment entry resources對于所有Web應(yīng)用程序可見。如果換成Context則表示只對相應(yīng)Web應(yīng)用程序可見。
Resource Definitions
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,Resource Definitions特性在GlobalNamingResources和Context中都有支持。
如下的兩種配置等價,都是為定義Resource:
<GlobalNamingResources ...>
...
<Resource name="jdbc/EmployeeDB" auth="Container" type="javax.sql.DataSource"
description="Employees Database for HR Applications"/>
...
</GlobalNamingResources>
<resource-ref>
<description>Employees Database for HR Applications</description>
<res-ref-name>jdbc/EmployeeDB</res-ref-name>
<res-ref-type>javax.sql.DataSource</res-ref-type>
<res-auth>Container</res-auth>
</resource-ref>
這里使用GlobalNamingResources表示Resource對于所有Web應(yīng)用程序可見。如果換成Context則表示只對相應(yīng)Web應(yīng)用程序可見。
Resource Links
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,Resource Links特性在GlobalNamingResources和Context中都有支持。
ResourceLink 元素用來將資源從全局上下文(global context)中連接到每個Web應(yīng)用的上下文(per-web-application contexts)中。使用方式依據(jù)GlobalNamingResources和Context的不同分成兩種:
<DefaultContext>
<ResourceLink name="bean/MyBeanFactory" global="bean/MyBeanFactory" type="com.mycompany.MyBean"/>
</DefaultContext>
<Context ...>
...
<ResourceLink name="linkToGlobalResource" global="simpleValue" type="java.lang.Integer"/>
...
</Context>
Transaction
從前面給出的 體系結(jié)構(gòu)圖 中可以看出,Transaction特性在GlobalNamingResources和Context中都有支持。
通過在JNDI中查詢java:comp/UserTransaction可以得到UserTransaction的引用。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
