资源组件
目录
简介
Resources 元素表示 Web 应用程序可用的所有资源。这包括类、JAR 文件、HTML、JSP 和有助于 Web 应用程序的任何其他文件。提供了实现来使用目录、JAR 文件和 WAR 作为这些资源的来源,并且可以扩展资源实现以提供对以其他形式存储的文件的支持,例如数据库或版本化存储库。
默认情况下,资源会被缓存。
注意:只有当 Web 应用程序不依赖于对其自身资源的直接文件系统访问,并使用 ServletContext 接口中的方法来访问它们时,才能使用基于非文件系统的 Resources 实现运行 Web 应用程序。
Resources 元素可以嵌套在 Context 组件内。如果未包含,将自动创建一个基于文件系统的默认 Resources,这足以满足大多数要求。
属性
通用属性
Resources 的所有实现都支持以下属性
属性 | 描述 |
---|---|
allowLinking |
如果此标志的值为 注意:此标志在 Windows 平台(或任何其他不区分大小写的文件系统)上不能设置为 true,因为它会禁用区分大小写检查,从而允许 JSP 源代码泄露,以及其他安全问题。 |
cacheMaxSize |
静态资源缓存的最大大小(以千字节为单位)。如果未指定,默认值为 |
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
目录。当 Web 应用程序停止时,将删除这些提取的 JAR。
从打包的 WAR 中提取 JAR 文件可能会提高性能,尤其是在应用程序需要 JAR 扫描时 Web 应用程序启动时。
嵌套组件
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\external\classes
,然后再搜索 D:\Projects\lib\library1.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.JarResourceSet"
webAppMount="/WEB-INF/classes"/>
</Resources>
简而言之,JAR 文件应作为映射到 /WEB-INF/classes
的 JarResourceSet
添加,而不是使用映射到 /WEB-INF/lib
的 FileResourceSet
。
缓存策略
通过配置自定义缓存策略,可以获得对静态资源缓存的更多控制。要配置自定义缓存策略,请将 <CacheStrategy> 元素嵌套在 <Resources> 元素中,并使用以下属性
属性 | 描述 |
---|---|
className |
要使用的实现的 Java 类名。此类必须实现 |
特殊功能
Resources 元素不具有任何特殊功能。