Context 容器
目錄
簡介
以下說明使用變數名稱 $CATALINA_BASE 來指涉大多數相對路徑所解析的基礎目錄。如果您尚未透過設定 CATALINA_BASE 目錄來為多個執行個體組態 Tomcat,則 $CATALINA_BASE 會設定為 $CATALINA_HOME 的值,也就是您安裝 Tomcat 的目錄。
Context 元素代表一個網路應用程式,會在特定虛擬主機中執行。每個網路應用程式都基於網路應用程式封存檔 (WAR) 檔案,或包含對應解壓縮內容的目錄,如 Servlet 規格書 (版本 2.2 或更新版本) 中所述。如需網路應用程式封存檔的更多資訊,您可以下載 Servlet 規格書,並檢閱 Tomcat 應用程式開發人員指南。
Catalina 會根據將最長可能的 Request URI 前綴與每個已定義 Context 的context 路徑進行比對,來選擇用於處理每個 HTTP 要求的網路應用程式。選取後,該 Context 會根據網路應用程式部署所定義的 servlet 對應,選擇適當的 servlet 來處理傳入的請求。
您可以定義任意數量的 Context 元素。每個此類 Context 在虛擬主機中都必須有唯一的 context 名稱。context 路徑不需要是唯一的 (請參閱以下的平行部署)。此外,必須存在 context 路徑等於零長度字串的 Context。此 Context 會成為此虛擬主機的預設網路應用程式,並用於處理與任何其他 Context 的 context 路徑不匹配的所有請求。
平行部署
您可以同時部署多個具有相同內容路徑的 Web 應用程式版本。用於將要求與內容版本配對的規則如下
- 如果要求中沒有任何階段資訊,請使用最新版本。
- 如果要求中存在階段資訊,請檢查每個版本的階段管理員是否有相符的階段,如果找到,請使用該版本。
- 如果要求中存在階段資訊,但找不到相符的階段,請使用最新版本。
主機可以透過 (undeployOldVersions
) 設定,以便在不再使用時移除以這種方式部署的舊版本。
命名
當主機執行autoDeploy
或deployOnStartup
操作時,Web 應用程式的名稱和內容路徑會從定義 Web 應用程式的檔案名稱中衍生。因此,內容路徑可能不會定義在嵌入應用程式中的META-INF/context.xml
中,並且內容名稱、內容路徑、內容版本和基本檔案名稱(名稱減去任何.war
或.xml
副檔名)之間有密切關係。
如果未指定版本,則內容名稱始終與內容路徑相同。如果內容路徑為空字串,則基本名稱將為 ROOT(始終為大寫),否則基本名稱將為內容路徑,移除開頭的 '/' 並將任何剩餘的 '/' 字元替換為 '#'
如果指定了版本,則內容路徑保持不變,而內容名稱和基本名稱都會附加字串 '##',後接版本識別碼。
以下提供這些命名慣例的一些範例。
內容路徑 | 內容版本 | 內容名稱 | 基本檔案名稱 | 範例檔案名稱 (.xml、.war 和目錄) |
---|---|---|---|---|
/foo | 無 | /foo | foo | foo.xml、foo.war、foo |
/foo/bar | 無 | /foo/bar | foo#bar | foo#bar.xml、foo#bar.war、foo#bar |
空字串 | 無 | 空字串 | ROOT | ROOT.xml、ROOT.war、ROOT |
/foo | 42 | /foo##42 | foo##42 | foo##42.xml、foo##42.war、foo##42 |
/foo/bar | 42 | /foo/bar##42 | foo#bar##42 | foo#bar##42.xml、foo#bar##42.war、foo#bar##42 |
空字串 | 42 | ##42 | ROOT##42 | ROOT##42.xml、ROOT##42.war、ROOT##42 |
版本元件被視為字串
,原因出於效能考量,並允許在版本控制架構中具備彈性。字串比較用於判斷版本順序。如果未指定版本,則會將其視為空字串。因此,foo.war
將被視為早於foo##11.war
的版本,而foo##11.war
將被視為早於foo##2.war
的版本。如果使用純數字版本控制架構,建議使用零填充,以便foo##002.war
被視為早於foo##011.war
的版本。
如果您想要部署一個 WAR 檔案或一個目錄,並使用一個與基本檔案名稱無關的內容路徑,那麼必須使用下列選項之一來防止重複部署
- 停用 autoDeploy 和 deployOnStartup,並在 server.xml 中定義所有 Context
- 將 WAR 和/或目錄定位在 Host 的
appBase
之外,並使用具有docBase
屬性的 context.xml 檔案來定義它。
定義 Context
不建議將 <Context> 元素直接放置在 server.xml 檔案中。這是因為它會使修改 Context 組態更具侵入性,因為無法在不重新啟動 Tomcat 的情況下重新載入主要的 conf/server.xml
檔案。預設的 Context 元素(請參閱下方)也會覆寫直接放置在 server.xml 中的任何 <Context> 元素的組態。為防止發生這種情況,在 server.xml 中定義的 <Context> 元素的 override
屬性應設定為 true
。
可以明確定義個別的 Context 元素
- 在應用程式檔案內的
/META-INF/context.xml
中的個別檔案中。根據 Host 的 copyXML 屬性,可以選擇性地將其複製到$CATALINA_BASE/conf/[enginename]/[hostname]/
,並重新命名為應用程式的基本檔案名稱加上「.xml」副檔名。 - 在
$CATALINA_BASE/conf/[enginename]/[hostname]/
目錄中的個別檔案(具有「.xml」副檔名)中。內容路徑和版本將從檔案的基本名稱(檔案名稱減去 .xml 副檔名)中派生。此檔案將永遠優先於封裝在 Web 應用程式 META-INF 目錄中的任何 context.xml 檔案。 - 在主要
conf/server.xml
中的 Host 元素內。
可以定義套用至多個 Web 應用程式的預設 Context 元素。個別 Web 應用程式的組態將會覆寫在這些預設值之一中組態的任何內容。在預設 Context 中定義的任何巢狀元素(例如 <Resource> 元素)將會針對預設值套用的每個 Context 建立一次。它們不會在 Context 元素之間共用。
- 在
$CATALINA_BASE/conf/context.xml
檔案中:所有 Web 應用程式都將載入 Context 元素資訊。 - 在
$CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default
檔案中:該主機的所有 Web 應用程式都將載入 Context 元素資訊。
除了 server.xml 之外,定義 Context 元素的檔案只能定義一個 Context 元素。
除了明確指定的 Context 元素之外,還有幾種技術可以自動為您建立 Context 元素。請參閱 自動應用程式部署 和 使用者 Web 應用程式 以取得更多資訊。
若要定義使用單一 WAR 檔案或目錄的多個內容,請使用上方 命名 區段中所述的選項之一,來建立一個路徑與基本檔案名稱無關的 Context。
屬性
常見屬性
Context 的所有實作都支援下列屬性
屬性 | 說明 |
---|---|
allowCasualMultipartParsing |
當呼叫 HttpServletRequest.getPart* 或 HttpServletRequest.getParameter* 時,如果 Tomcat 應自動剖析 multipart/form-data 要求主體,即使目標 servlet 未標記 @MultipartConfig 標註(有關詳細資訊,請參閱 Servlet 規格 3.0,第 3.2 節)。請注意,除了 |
allowMultipleLeadingForwardSlashInPath |
Tomcat 會將 URI 中多個 |
altDDName |
此內容的替代部署描述符的絕對路徑。這會覆寫位於 |
alwaysAccessSession |
如果此值為 如果 |
backgroundProcessorDelay |
此值代表在此內容及其子容器(包括所有包裝器)上呼叫 backgroundProcess 方法之間的延遲(以秒為單位)。如果其延遲值不為負值(這表示它們正在使用自己的處理緒執行緒),則不會呼叫子容器。將此值設定為正值會導致產生執行緒。在等待指定的時間量後,執行緒會在此主機及其所有子容器上呼叫 backgroundProcess 方法。內容會使用背景處理來執行工作階段到期和類別監控以重新載入。如果未指定,此屬性的預設值為 -1,這表示內容會依賴其父主機的背景處理執行緒。 |
className |
要使用的實作的 Java 類別名稱。此類別必須實作 |
containerSciFilter |
指定應濾除並不用於此內容之容器提供 SCI 的正規表示式。比對使用 |
contextGetResourceRequiresSlash |
如果為 如果 |
cookies |
如果希望使用 Cookie 來進行會話識別通訊(這是預設值),請設為 |
createUploadTargets |
如果 Tomcat 應嘗試為 Servlet 的 |
crossContext |
如果希望此應用程式中的 |
dispatcherWrapsSameObject |
如果為 如果 |
docBase |
此 Web 應用程式的文件基礎目錄(也稱為內容根目錄),或 Web 應用程式封存檔檔案的路徑名稱(如果此 Web 應用程式是直接從 WAR 檔案執行)。您可以為此目錄或 WAR 檔案指定絕對路徑名稱,或相對於擁有者 主機 的 除非 Context 元素定義在 server.xml 中,或 如果 |
dispatchersUseEncodedPaths |
控制用於取得請求調度程式的呼叫中所使用的路徑是否預期會編碼。這會影響 Tomcat 處理取得請求調度程式的呼叫的方式,以及 Tomcat 內部產生用於取得請求調度程式的路徑的方式。如果未指定,則使用預設值 |
failCtxIfServletStartFails |
設定為 如果未指定,則使用父 Host 組態中同名的屬性(如果已指定)。否則,使用預設值 |
fireRequestListenersOnForwards |
設定為 |
logEffectiveWebXml |
如果要在應用程式啟動時記錄用於 Web 應用程式的有效 web.xml(在 INFO 層級),請設定為 |
mapperContextRootRedirectEnabled |
如果已啟用,則 Web 應用程式內容根目錄的請求會由 Mapper(而不是預設的 Servlet)重新導向(加上尾斜線)(如果需要)。這更有效率,但會確認內容路徑存在的副作用。如果未指定,則使用預設值 |
mapperDirectoryRedirectEnabled |
如果已啟用,則 Web 應用程式目錄的請求會由 Mapper(而不是預設的 Servlet)重新導向(加上尾斜線)(如果需要)。這更有效率,但會確認目錄存在的副作用。如果未指定,則使用預設值 |
override |
設定為 |
parallelAnnotationScanning |
設定為 |
path |
此 Web 應用程式的內容路徑,與每個請求 URI 的開頭相符,以選取適當的 Web 應用程式進行處理。特定 主機 中的所有內容路徑都必須是唯一的。如果您指定一個空字串 ("") 的內容路徑,您就是在為此主機定義預設 Web 應用程式,它將處理未指定給其他內容的路徑的所有請求。 此屬性只能在 server.xml 中靜態定義內容路徑時使用。在所有其他情況下,將從用於 .xml 內容路徑檔案或 即使在 server.xml 中靜態定義內容路徑,除非 |
preemptiveAuthentication |
設定為 |
privileged |
設定為 |
reloadable |
如果您希望 Catalina 監控 |
resourceOnlyServlets |
以逗號分隔的 Servlet 名稱清單(如在 |
sendRedirectBody |
如果為 |
sessionCookieDomain |
用於此內容所建立的所有會話 Cookie 的網域。如果設定,這將覆寫 Web 應用程式所設定的任何網域。如果未設定,將使用 Web 應用程式所指定的任何值(如果有的話)。 |
sessionCookieName |
用於此內容所建立的所有會話 Cookie 的名稱。如果設定,這將覆寫 Web 應用程式所設定的任何名稱。如果未設定,將使用 Web 應用程式所指定的任何值(如果有的話),或者如果 Web 應用程式未明確設定,則使用名稱 |
sessionCookiePath |
用於此內容所建立的所有會話 Cookie 的路徑。如果設定,這將覆寫 Web 應用程式所設定的任何路徑。如果未設定,將使用 Web 應用程式所指定的任何值,或者如果 Web 應用程式未明確設定,則使用內容路徑。若要設定所有 Web 應用程式以使用空路徑(這對於 portlet 規範實作很有用),請在全域 注意:一旦使用 |
sessionCookiePathUsesTrailingSlash |
某些瀏覽器,例如 Internet Explorer、Safari 和 Edge,會傳送一個工作階段 Cookie 給路徑為 |
suspendWrappedResponseAfterForward |
如果此旗標的值為 |
swallowAbortedUploads |
如果 Tomcat 不應讀取任何額外的要求主體資料以中斷上傳,而應中斷用戶端連線,則設定為
不讀取額外資料會更快釋放要求處理執行緒。很遺憾,如果無法寫入完整的要求,大多數 HTTP 用戶端不會讀取回應。 預設值為 請注意,如果在要求處理期間發生觸發 5xx 回應的錯誤,任何未讀取的要求資料都將永遠被忽略,而且一旦寫入錯誤回應,用戶端連線就會關閉。 |
swallowOutput |
如果此標記的值為 |
tldValidation |
如果此標記的值為 |
useBloomFilterForArchives |
已棄用:如果此值為 如果未指定,將使用預設值 此值可由 資源 中的 archiveIndexStrategy 覆寫 |
useHttpOnly |
是否應在階段記錄器上設定 HttpOnly 標記,以防止用戶端端腳本存取階段 ID?預設為 |
usePartitioned |
是否應在階段記錄器上設定 Partitioned 標記?預設為 注意:用於表示分區記錄器作為 CHIPS 一部分的屬性名稱並未由 RFC 定義,且一旦 RFC 中包含等效功能,可能會以非向下相容的方式變更。 |
useRelativeRedirects |
控制由呼叫 |
validateClientProvidedNewSessionId |
當用戶端提供新階段的 ID 時,此屬性會控制是否驗證該 ID。使用用戶端提供的階段 ID 的唯一使用案例是在多個網路應用程式中使用共用階段 ID。因此,任何用戶端提供的階段 ID 都應已存在於另一個網路應用程式中。如果啟用此檢查,只有在階段 ID 存在於目前主機的至少一個其他網路應用程式中時,才會使用用戶端提供的階段 ID。請注意,無論此設定為何,以下額外測試都將永遠套用
如果未指定,將使用預設值 |
wrapperClass |
此 Context 管理的 servlet 將使用的 `org.apache.catalina.Wrapper` 實作類別的 Java 類別名稱。如果未指定,將使用標準預設值。 |
xmlBlockExternal |
如果此旗標的值為 `true`,將不允許解析此 Web 應用程式的 `web.xml`、`web-fragment.xml`、`tomcat-web.xml`、`*.tld`、`*.jspx`、`*.tagx` 和 `tagPlugins.xml` 檔案,以載入外部實體。如果未指定,將使用 `true` 的預設值。 |
xmlNamespaceAware |
如果此旗標的值為 `true`,將以符合名稱空間的方式解析此 Web 應用程式的 `web.xml`、`web-fragment.xml` 和 `tomcat-web.xml` 檔案。請注意,`*.tld`、`*.jspx` 和 `*.tagx` 檔案總是使用符合名稱空間的剖析器來剖析,而 `tagPlugins.xml` 檔案(如果有)則從不使用符合名稱空間的剖析器來剖析。另請注意,如果您開啟此旗標,您可能還需要開啟 `xmlValidation`。如果 `org.apache.catalina.STRICT_SERVLET_COMPLIANCE` 系統屬性 設為 `true`,此屬性的預設值將為 `true`,否則預設值將為 `false`。將此屬性設為 `true` 會造成效能損失。 |
xmlValidation |
如果此旗標的值為 `true`,將使用驗證剖析器來解析此 Web 應用程式的 `web.xml`、`web-fragment.xml` 和 `tomcat-web.xml` 檔案。如果 `org.apache.catalina.STRICT_SERVLET_COMPLIANCE` 系統屬性 設為 `true`,此屬性的預設值將為 `true`,否則預設值將為 `false`。將此屬性設為 `true` 會造成效能損失。 |
標準實作
Context 的標準實作是 org.apache.catalina.core.StandardContext。它支援以下額外屬性(除了上面列出的共用屬性之外)
屬性 | 說明 |
---|---|
addWebinfClassesResources |
此屬性控制除了從 Web 應用程式 JAR 檔案中的 `META-INF/resources` 提供靜態資源之外,是否也從 `WEB-INF/classes/META-INF/resources` 提供靜態資源。這只適用於主版本為 3 或更高的 Web 應用程式。由於這是 Servlet 3 規範的專有延伸,因此預設為停用。若要啟用此功能,請將屬性設為 `true`。 |
antiResourceLocking |
如果為 請注意,將此設定為 請注意,在主機的 |
clearReferencesHttpClientKeepAliveThread |
如果為 |
clearReferencesObjectStreamClassCaches |
如果為 與 |
clearReferencesRmiTargets |
如果為 |
clearReferencesStopThreads |
如果為 |
clearReferencesStopTimerThreads |
如果為 |
clearReferencesThreadLocals |
如果為 |
copyXML |
如果要將嵌入在應用程式中的內容 XML 描述符(位於 |
jndiExceptionOnFailedWrite |
如果為 |
renewThreadsWhenStoppingContext |
如果為 |
skipMemoryLeakChecksOnJvmShutdown |
如果為 |
unloadDelay |
容器等待 servlet 卸載的毫秒數。如果未指定,預設值為 |
unpackWAR |
如果為 |
useNaming |
設為 |
workDir |
由這個 Context 提供的暫存目錄的路徑名稱,供關聯 Web 應用程式中的 servlet 暫時讀寫使用。此目錄將透過 servlet context 屬性 (類型為 |
巢狀元件
您可以在 Context 元素中巢狀對應元素,最多巢狀一個以下公用程式元件實例
- Cookie Processor - 設定 HTTP cookie 標頭的剖析和產生。
- Loader - 設定 Web 應用程式類別載入器,將用於載入此 Web 應用程式的 servlet 和 bean 類別。通常,類別載入器的預設設定就已足夠。
- Manager - 設定會話管理員,將用於為此 Web 應用程式建立、銷毀和保留 HTTP 會話。通常,會話管理員的預設設定就已足夠。
- Realm - 設定一個領域,讓其使用者資料庫及其關聯的角色可專門用於這個特定的 Web 應用程式。如果未指定,此 Web 應用程式將使用與擁有者 Host 或 Engine 關聯的領域。
- 資源 - 設定資源管理員,用於存取與此 Web 應用程式相關聯的靜態資源。一般來說,資源管理員的預設設定就已足夠。
- WatchedResource - 自動部署程式會監控 Web 應用程式的指定靜態資源是否有更新,如果有更新,就會重新載入 Web 應用程式。此元素的內容必須是字串。
- JarScanner - 設定 Jar 掃描器,用於掃描 Web 應用程式中是否有 JAR 檔案和類別檔案目錄。通常會在 Web 應用程式啟動時使用,用於識別設定檔,例如 TLD 或 web-fragment.xml 檔案,這些檔案必須在 Web 應用程式初始化時處理。一般來說,Jar 掃描器的預設設定就已足夠。
特殊功能
記錄
一個內容與 org.apache.catalina.core.ContainerBase.[enginename].[hostname].[path]
記錄類別相關聯。請注意,括號實際上是名稱的一部分,不要省略。
存取記錄
當您執行 Web 伺服器時,通常會產生一個輸出檔案,稱為存取記錄,其中會以標準格式針對伺服器處理的每個要求產生一行資訊。Catalina 包含一個可選擇的 Valve 實作,可以用來建立與 Web 伺服器建立的相同標準格式的存取記錄,或任何數量的自訂格式。
您可以要求 Catalina 為 Engine、Host 或 Context 處理的所有要求建立存取記錄,方法是巢狀 Valve 元素,如下所示
<Context>
...
<Valve className="org.apache.catalina.valves.AccessLogValve"
prefix="localhost_access_log" suffix=".txt"
pattern="common"/>
...
</Context>
請參閱 存取記錄 Valve 以取得支援設定屬性的詳細資訊。
自動 Context 組態
如果您使用標準的 Context 實作,當 Catalina 啟動或此 Web 應用程式重新載入時,會自動執行下列設定步驟。不需要特殊設定即可啟用此功能。
- 如果您尚未宣告自己的 Loader 元素,就會設定標準的 Web 應用程式類別載入器。
- 如果您尚未宣告自己的 Manager 元素,就會設定標準的階段管理員。
- 如果您尚未宣告自己的 Resources 元素,就會設定標準的資源管理員。
conf/web.xml
中列出的 Web 應用程式屬性會做為此 Web 應用程式的預設值。這用於建立預設對應 (例如將*.jsp
副檔名對應到對應的 JSP servlet),以及適用於所有 Web 應用程式的其他標準功能。- 此 Web 應用程式中
/WEB-INF/tomcat-web.xml
資源中列出的 Web 應用程式屬性會被處理 (如果此資源存在),優先於預設值。 - 此 Web 應用程式中,列於
/WEB-INF/web.xml
資源的 Web 應用程式屬性將會處理(如果此資源存在)。 - 如果您的 Web 應用程式已指定可能需要使用者驗證的安全約束,將會設定一個適當的驗證器,以實作您已選取的登入方法。
Context 參數
您可以設定命名值,透過在這個元素內嵌套 <Parameter>
元素,這些命名值將對 Web 應用程式顯示為 servlet context 初始化參數。例如,您可以建立一個像這樣的初始化參數
<Context>
...
<Parameter name="companyName" value="My Company, Incorporated"
override="false"/>
...
</Context>
這等同於在 Web 應用程式部署描述符 (/WEB-INF/web.xml
) 中包含下列元素
<context-param>
<param-name>companyName</param-name>
<param-value>My Company, Incorporated</param-value>
</context-param>
但不需要修改部署描述符來自訂這個值。
<Parameter>
元素的有效屬性如下
屬性 | 說明 |
---|---|
description |
此 context 初始化參數的選用人可讀描述。 |
name |
要建立的 context 初始化參數的名稱。 |
override |
如果您不希望 web 應用程式部署描述符中找到的相同參數名稱的 |
value |
當呼叫 |
環境項目
您可以設定命名值,透過在這個元素內嵌套 <Environment>
項目,這些命名值將對 Web 應用程式顯示為環境項目資源。例如,您可以建立一個像這樣的環境項目
<Context>
...
<Environment name="maxExemptions" value="10"
type="java.lang.Integer" override="false"/>
...
</Context>
這等同於在 Web 應用程式部署描述符 (/WEB-INF/web.xml
) 中包含下列元素
<env-entry>
<env-entry-name>maxExemptions</env-entry-name>
<env-entry-value>10</env-entry-value>
<env-entry-type>java.lang.Integer</env-entry-type>
</env-entry>
但不需要修改部署描述符來自訂這個值。
<Environment>
元素的有效屬性如下
屬性 | 說明 |
---|---|
description |
此環境項目的選用人可讀描述。 |
name |
要建立的環境項目的名稱,相對於 |
override |
如果您不希望 web 應用程式部署描述符中找到的相同環境項目名稱的 |
type |
Web 應用程式預期的此環境項目的完全限定 Java 類別名稱。必須是 web 應用程式部署描述符中 |
value |
當從 JNDI 背景請求時,將會顯示給應用程式的參數值。此值必須可轉換為由 |
生命週期偵聽器
如果您已實作一個 Java 物件,需要知道此 背景 何時啟動或停止,您可以透過在此元素內嵌套一個 偵聽器 元素來宣告它。您指定的類別名稱必須實作 org.apache.catalina.LifecycleListener
介面,且此類別必須封裝在 jar 中,並放置在 $CATALINA_HOME/lib
目錄中。它將收到關於對應生命週期事件發生的通知。此類偵聽器的設定如下
<Context>
...
<Listener className="com.mycompany.mypackage.MyListener" ... >
...
</Context>
請注意,偵聽器可以有任意數量的其他屬性,這些屬性可以從此元素設定。屬性名稱會使用標準屬性方法命名模式,與對應的 JavaBean 屬性名稱相符。
要求篩選器
您可以要求 Catalina 檢查傳送至周圍 引擎、主機 或 背景 元素的每個內部請求的 IP 位址或主機名稱。遠端位址或名稱將會與設定的「接受」和/或「拒絕」篩選器進行比對,這些篩選器是使用 java.util.regex
正規表示法語法定義的。來自未接受位置的請求將會被拒絕,並顯示 HTTP「禁止」錯誤。範例篩選器宣告
<Context>
...
<Valve className="org.apache.catalina.valves.RemoteHostValve"
allow=".*\.mycompany\.com|www\.yourcompany\.com"/>
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
deny="192\.168\.1\.\d+"/>
...
</Context>
資源定義
您可以宣告要傳回給 web 應用程式部署描述子中 <resource-ref>
和 <resource-env-ref>
元素的 JNDI 查詢資源特性。您必須同時將所需的資源參數定義為 Resource
元素的屬性,以設定要使用的物件工廠(如果 Tomcat 尚未知道),以及用於設定該物件工廠的屬性。
例如,您可以建立類似這樣的資源定義
<Context>
...
<Resource name="jdbc/EmployeeDB" auth="Container"
type="javax.sql.DataSource"
description="Employees Database for HR Applications"/>
...
</Context>
這等同於在 Web 應用程式部署描述符 (/WEB-INF/web.xml
) 中包含下列元素
<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>
但不需要修改部署描述符來自訂這個值。
<Resource>
元素的有效屬性如下
屬性 | 說明 |
---|---|
auth |
指定 Web 應用程式程式碼是否以程式化方式登入對應的資源管理員,或容器是否會代表應用程式登入資源管理員。此屬性的值必須為 |
closeMethod |
當不再需要單例資源時,呼叫單例資源的零參數方法的名稱。這是為了加速資源的清理,否則會作為垃圾回收的一部分。如果 對於實作 |
description |
此資源的選用人可讀描述。 |
name |
相對於 |
scope |
指定是否可以共用透過此資源管理員取得的連線。此屬性的值必須為 |
singleton |
指定此資源定義是否為單例資源,亦即只有一個資源實例。如果此屬性為 |
type |
Web 應用程式在查詢此資源時預期的完全限定 Java 類別名稱。 |
資源連結
此元素用於建立至全域 JNDI 資源的連結。然後在連結名稱上執行 JNDI 查詢會傳回連結的全域資源。
例如,您可以建立類似這樣的資源連結
<Context>
...
<ResourceLink name="linkToGlobalResource"
global="simpleValue"
type="java.lang.Integer"
...
</Context>
<ResourceLink>
元素的有效屬性如下
屬性 | 說明 |
---|---|
global |
全域 JNDI 環境中連結的全域資源名稱。 |
name |
相對於 |
type |
Web 應用程式在查詢此資源連結時預期的完全限定 Java 類別名稱。 |
factory |
建立這些物件的類別的完全限定 Java 類別名稱。此類別應實作 |
當屬性 factory="org.apache.naming.factory.DataSourceLinkFactory"
時,資源連結可以使用兩個額外屬性,以允許共用資料來源使用不同的憑證。當這兩個額外屬性與 javax.sql.DataSource
類型結合使用時,不同的內容可以與不同的憑證共用一個全域資料來源。在幕後,呼叫 getConnection()
僅轉換為對全域資料來源的呼叫 getConnection(username, password)
。這是讓程式碼透明於所使用架構的簡便方法,但仍可以在全域組態中控制連線(或池)。
屬性 | 說明 |
---|---|
使用者名稱 |
連結的全域 DataSource 上 |
密碼 |
連結的全域 DataSource 上 |
共用資料來源範例
警告:此功能僅在全域 DataSource 支援 getConnection(username, password)
方法時才有效。Tomcat 預設使用的 Apache Commons DBCP 2 池不支援它。請參閱其 BasicDataSource
類別的 Javadoc。 Apache Tomcat JDBC 池 支援它,但預設情況下此支援已停用,且可透過 alternateUsernameAllowed
屬性啟用。請參閱其文件以取得詳細資訊。
<GlobalNamingResources>
...
<Resource name="sharedDataSource"
global="sharedDataSource"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
alternateUsernameAllowed="true"
username="bar"
password="barpass"
...
...
</GlobalNamingResources>
<Context path="/foo"...>
...
<ResourceLink
name="appDataSource"
global="sharedDataSource"
type="javax.sql.DataSource"
factory="org.apache.naming.factory.DataSourceLinkFactory"
username="foo"
password="foopass"
...
</Context>
<Context path="/bar"...>
...
<ResourceLink
name="appDataSource"
global="sharedDataSource"
type="javax.sql.DataSource"
...
</Context>
當在 /foo
內容中提出 getConnection()
要求時,要求會轉換為 getConnection("foo","foopass")
,而 /bar
中的要求會直接傳遞。
交易
您可以宣告要為 java:comp/UserTransaction
的 JNDI 查詢傳回的 UserTransaction 的特性。您必須定義一個物件工廠類別來實例化此物件,以及 Transaction
元素的屬性中所需的資源參數,以及用於組態該物件工廠的屬性。
<Transaction>
元素的有效屬性如下
屬性 | 說明 |
---|---|
factory |
JNDI 物件工廠的類別名稱。 |