Resources 元件

目錄

簡介

Resources 元素表示網頁應用程式可用的所有資源。這包括類別、JAR 檔案、HTML、JSP 和任何其他有助於網頁應用程式的檔案。提供實作以使用目錄、JAR 檔案和 WAR 作為這些資源的來源,並且可以延伸資源實作以提供支援以其他形式儲存的檔案,例如資料庫或版本控制儲存庫。

預設會快取資源。

注意:只有當網頁應用程式不依賴直接檔案系統存取其自己的資源,並使用 ServletContext 介面中的方法存取它們時,才能執行基於非檔案系統的 Resources 實作的網頁應用程式。

Resources 元素可以巢狀在 Context 元件內。如果未包含,將自動建立預設的基於檔案系統的 Resources,這足以滿足大多數需求。

屬性

常見屬性

Resources 的所有實作都支援下列屬性

屬性 說明
allowLinking

如果這個旗標的值為 true,符號連結將被允許在網路應用程式內部,指向網路應用程式基本路徑內部或外部的資源。如果未指定,旗標的預設值為 false

注意:這個旗標在 Windows 平台(或任何其他沒有大小寫敏感檔案系統的作業系統)上不能設定為 true,因為它會停用大小寫敏感性檢查,允許 JSP 原始碼揭露,以及其他安全性問題。

cacheMaxSize

靜態資源快取的最大大小,單位為 KB。如果未指定,預設值為 10240(10 MiB)。這個值可以在網路應用程式執行時變更(例如透過 JMX)。如果快取使用超過新限制的記憶體,快取會嘗試隨著時間推移縮小大小以符合新限制。如有必要,cacheObjectMaxSize 會縮小,以確保它不大於 cacheMaxSize/20

cacheObjectMaxSize

將被放置在快取中的靜態資源的最大大小。如果未指定,預設值為 512(512 KB)。如果這個值大於 cacheMaxSize/20,它會縮小到 cacheMaxSize/20。這個值可以在網路應用程式執行時變更(例如透過 JMX)。

cacheTtl

快取項目重新驗證之間的毫秒數。如果未指定,預設值為 5000(5 秒)。這個值可以在網路應用程式執行時變更(例如透過 JMX)。當資源被快取時,它會繼承在快取時生效的 TTL,並保留該 TTL,直到資源從快取中驅逐,而不論對這個屬性進行的任何後續變更。

cachingAllowed

如果這個旗標的值為 true,將會使用靜態資源快取。如果未指定,旗標的預設值為 true。這個值可以在網路應用程式執行時變更(例如透過 JMX)。當快取被停用時,快取中的任何資源都會從快取中清除。

className

要使用的實作的 Java 類別名稱。這個類別必須實作 org.apache.catalina.WebResourceRoot 介面。如果未指定,將會使用標準值(定義如下)。

trackLockedFiles

控制是否啟用追蹤鎖定檔案功能。如果啟用,所有呼叫會傳回鎖定檔案的物件並需要關閉以釋放鎖定的方法(例如 ServletContext.getResourceAsStream())將會執行多項其他工作。

  • 呼叫方法時堆疊追蹤會被記錄並與傳回的物件關聯。
  • 傳回的物件會被包裝,以便可以偵測呼叫 close()(或等效方法)以釋放資源。一旦資源被釋放,物件追蹤就會停止。
  • 所有在 Web 應用程式關閉時仍鎖定的資源會被記錄,然後關閉。

如果未指定,將會使用預設值 false

archiveIndexStrategy

如果這是 simple,那麼 JAR 檔案查詢會使用雜湊映射,除非 Context 中的 useBloomFilterForArchives 明確定義。

如果這是 bloom,那麼布隆過濾器會用來加速檔案查詢。這對於包含大量 JAR 的 Web 應用程式部署速度有幫助。

如果這是 purged,那麼布隆過濾器會用來加速檔案查詢,但可以在執行期間清除。建議使用 bloom 以避免重新初始化布隆過濾器。

如果未指定,將會使用預設值 simple

標準實作

標準根實作

Resources 的標準實作是 org.apache.catalina.webresources.StandardRoot。它不支援任何其他屬性。

提取根實作

Resources 的提取實作是 org.apache.catalina.webresources.ExtractingRoot。它不支援任何其他屬性。

當將 Web 應用程式部署為封裝的 WAR 檔案時,提取根會從 /WEB-INF/lib 中提取任何 JAR 檔案到位於 Web 應用程式工作目錄中的 application-jars 目錄。這些提取的 JAR 會在 Web 應用程式停止時移除。

從封裝的 WAR 中提取 JAR 檔案可能會提升效能,特別是在 Web 應用程式啟動時,且應用程式需要 JAR 掃描。

巢狀元件

Web 應用程式的主要資源由 Context 定義的 docBase 定義。可以透過定義一個或多個巢狀元件,讓 Web 應用程式可以使用其他組態設定和/或資源。

PreResources

在主要資源之前會搜尋 PreResources。它們會按照定義順序被搜尋。若要組態 PreResources,請在 <Resources> 元素中巢狀一個 <PreResources> 元素,並具有下列屬性

屬性 說明
base

識別要使用的資源所在位置。這個屬性是 Tomcat 提供的 org.apache.catalina.WebResourceSet 實作所需要的,且應該指定資源所在檔案、目錄或 JAR 的絕對路徑。自訂實作可能不需要它。

className

要使用的實作的 Java 類別名稱。這個類別必須實作 org.apache.catalina.WebResourceSet 介面。Tomcat 提供三個標準實作:org.apache.catalina.webresources.DirResourceSetorg.apache.catalina.webresources.FileResourceSetorg.apache.catalina.webresources.JarResourceSet。也可以使用自訂實作。

internalPath

識別資源所在的 base 內的路徑。這通常只在資源未位於 JAR 根目錄(如資源 JAR 的情況)時,才會與 JAR 檔案一起使用。這個屬性是 Tomcat 提供的 org.apache.catalina.WebResourceSet 實作所需要的,且必須以「/」開頭。自訂實作可能不需要它。如果未指定,將使用預設值「/」。

readOnly

如果為 true,則此資源集內的資源不可刪除、建立或修改。例如 org.apache.catalina.webresources.JarResourceSet,這個屬性已寫死為 true,且不可變更。對於 org.apache.catalina.webresources.DirResourceSetorg.apache.catalina.webresources.FileResourceSet 的實例,這個屬性的預設值為 false

webAppMount

識別這些資源將在其中提供的 Web 應用程式內的路徑。對於 Tomcat 提供的 org.apache.catalina.WebResourceSet 實作,這個屬性是需要的,且必須以「/」開頭。自訂實作可能不需要它。如果未指定,將使用預設值「/」。

JAR 資源

JarResources 會在主資源之後,但 PostResources 之前搜尋。它們會按照定義順序搜尋。若要設定 JarResources,請在 <Resources> 元素內巢狀一個 <JarResources> 元素。設定屬性與 PreResources 相同。

在 Web 應用程式啟動期間,JAR 掃描程序會檢查已掃描的 JAR 中 /META-INF/resources 底下的內容。找到時,這個靜態內容會新增到 JarResources。

後資源

PostResources 會在資源 JAR 之後搜尋。它們會按照定義順序搜尋。若要設定 PostResources,請在 <Resources> 元素內巢狀一個 <PostResources> 元素。設定屬性與 PreResources 相同。

排序

除了上面描述的資源組之外,標準實作也維護 ClassResources,代表對應到映射至 /WEB-INF/classes 的 JAR 檔案中的類別。這允許其他元件使用單一呼叫搜尋類別,而不是先呼叫搜尋 /WEB-INF/classes,再呼叫搜尋 /WEB-INF/lib 中的 JAR。當 Web 應用程式啟動時,ClassResources 會從映射至 /WEB-INF/lib 的 JAR 中填入。

因此,完整的搜尋順序為

  • PreResources
  • MainResources
  • ClassResources
  • JarResources
  • PostResources

在 Web 應用程式啟動時填入 ClassResources 和 JarResources,表示需要小心正確加入基於 JAR 的資源才能取得想要的行為。考慮以下範例

<Resources>
  <PostResources base="D:\Projects\external\classes"
                 className="org.apache.catalina.webresources.DirResourceSet"
                 webAppMount="/WEB-INF/classes"/>
  <PostResources base="D:\Projects\lib\library1.jar"
                 className="org.apache.catalina.webresources.FileResourceSet"
                 webAppMount="/WEB-INF/lib/library1.jar"/>
</Resources>

由於兩個資源都是 PostResources,因此可能會預期在 D:\Projects\lib\library1.jar 之前會搜尋 D:\Projects\external\classes 的類別。然而,透過使用 FileResourceSet 加入 JAR,JAR 會映射至 /WEB-INF/lib,並會在應用程式啟動時與 /WEB-INF/lib 中的其他 JAR 一起處理。JAR 檔案中的類別會加入 ClassResources,表示會在 D:\Projects\external\classes 中的類別之前搜尋這些類別。如果想要的行為是在 D:\Projects\lib\library1.jar 之前搜尋 D:\Projects\external\classes,則需要稍微不同的設定

<Resources>
  <PostResources base="D:\Projects\external\classes"
                 className="org.apache.catalina.webresources.DirResourceSet"
                 webAppMount="/WEB-INF/classes"/>
  <PostResources base="D:\Projects\lib\library1.jar"
                 className="org.apache.catalina.webresources.JarResourceSet"
                 webAppMount="/WEB-INF/classes"/>
</Resources>

簡而言之,JAR 檔案應該加入為映射至 /WEB-INF/classesJarResourceSet,而不是使用映射至 /WEB-INF/libFileResourceSet

快取策略

透過設定自訂快取策略,可以進一步控制靜態資源的快取。若要設定自訂快取策略,請在 <Resources> 元素內巢狀 <CacheStrategy> 元素,並使用下列屬性

屬性 說明
className

要使用的實作的 Java 類別名稱。此類別必須實作 org.apache.catalina.WebResourceRoot$CacheStrategy 介面。

特殊功能

Resources 元素沒有任何特殊功能。