Resources 元件
目錄
簡介
Resources 元素表示網頁應用程式可用的所有資源。這包括類別、JAR 檔案、HTML、JSP 和任何其他有助於網頁應用程式的檔案。提供實作以使用目錄、JAR 檔案和 WAR 作為這些資源的來源,並且可以延伸資源實作以提供支援以其他形式儲存的檔案,例如資料庫或版本控制儲存庫。
預設會快取資源。
注意:只有當網頁應用程式不依賴直接檔案系統存取其自己的資源,並使用 ServletContext 介面中的方法存取它們時,才能執行基於非檔案系統的 Resources 實作的網頁應用程式。
Resources 元素可以巢狀在 Context 元件內。如果未包含,將自動建立預設的基於檔案系統的 Resources,這足以滿足大多數需求。
屬性
常見屬性
Resources 的所有實作都支援下列屬性
屬性 | 說明 |
---|---|
allowLinking |
如果這個旗標的值為 注意:這個旗標在 Windows 平台(或任何其他沒有大小寫敏感檔案系統的作業系統)上不能設定為 true,因為它會停用大小寫敏感性檢查,允許 JSP 原始碼揭露,以及其他安全性問題。 |
cacheMaxSize |
靜態資源快取的最大大小,單位為 KB。如果未指定,預設值為 |
cacheObjectMaxSize |
將被放置在快取中的靜態資源的最大大小。如果未指定,預設值為 |
cacheTtl |
快取項目重新驗證之間的毫秒數。如果未指定,預設值為 |
cachingAllowed |
如果這個旗標的值為 |
className |
要使用的實作的 Java 類別名稱。這個類別必須實作 |
trackLockedFiles |
控制是否啟用追蹤鎖定檔案功能。如果啟用,所有呼叫會傳回鎖定檔案的物件並需要關閉以釋放鎖定的方法(例如
如果未指定,將會使用預設值 |
archiveIndexStrategy |
如果這是 如果這是 如果這是 如果未指定,將會使用預設值 |
標準實作
標準根實作
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 提供的 |
className |
要使用的實作的 Java 類別名稱。這個類別必須實作 |
internalPath |
識別資源所在的 base 內的路徑。這通常只在資源未位於 JAR 根目錄(如資源 JAR 的情況)時,才會與 JAR 檔案一起使用。這個屬性是 Tomcat 提供的 |
readOnly |
如果為 |
webAppMount |
識別這些資源將在其中提供的 Web 應用程式內的路徑。對於 Tomcat 提供的 |
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/classes
的 JarResourceSet
,而不是使用映射至 /WEB-INF/lib
的 FileResourceSet
。
快取策略
透過設定自訂快取策略,可以進一步控制靜態資源的快取。若要設定自訂快取策略,請在 <Resources> 元素內巢狀 <CacheStrategy> 元素,並使用下列屬性
屬性 | 說明 |
---|---|
className |
要使用的實作的 Java 類別名稱。此類別必須實作 |
特殊功能
Resources 元素沒有任何特殊功能。