Resources 组件
目录
简介
Resources 元素表示 Web 应用程序可用的所有资源。这包括类、JAR 文件、HTML、JSP 以及任何其他构成 Web 应用程序的文件。提供了使用目录、JAR 文件和 WAR 文件作为这些资源来源的实现,并且资源实现可以扩展以支持存储在其他形式的文件,例如数据库或版本库中的文件。
资源默认启用缓存。
注意:使用非文件系统(non-filesystem based)的 Resources 实现来运行 Web 应用程序,只有在 Web 应用程序不依赖于直接的文件系统访问其自身资源,并且使用 ServletContext 接口中的方法来访问它们时才可能。
一个 Resources 元素可以嵌套在 Context 组件内部。如果未包含,则会自动创建一个默认的基于文件系统的 Resources,这对于大多数需求来说已足够。
属性
通用属性
所有 Resources 实现都支持以下属性:
属性 | 描述 |
---|---|
allowLinking |
如果此标志的值为 注意:在 Windows 平台(或任何其他不区分大小写文件系统的操作系统)上,此标志不得设置为 true,因为它会禁用大小写敏感性检查,从而可能导致 JSP 源代码泄露等安全问题。 |
archiveIndexStrategy |
如果此值为 如果此值为 如果此值为 如果未指定,将使用默认值 |
cacheMaxSize |
静态资源缓存的最大大小(以千字节为单位)。如果未指定,默认值为 |
cacheObjectMaxSize |
将放入缓存的静态资源的最大大小。如果未指定,默认值为 |
cacheTtl |
缓存条目重新验证之间的时间量(以毫秒为单位)。如果未指定,默认值为 |
cachingAllowed |
如果此标志的值为 |
className |
要使用的实现的 Java 类名。此类必须实现 |
readOnly |
如果此标志的值为 |
trackLockedFiles |
控制是否启用跟踪锁定文件功能。如果启用,所有返回锁定文件对象且需要关闭以释放该锁的方法调用(例如
如果未指定,将使用默认值 |
标准实现
标准根实现
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 文件可以提高性能,特别是在应用程序需要 JAR 扫描的 Web 应用程序启动时。
嵌套组件
Web 应用程序的主资源由为 Context 定义的 docBase 决定。通过定义一个或多个嵌套组件,可以向 Web 应用程序提供额外的配置设置和/或资源。
预资源(PreResources)
预资源(PreResources)在主资源之前被搜索。它们将按照定义的顺序被搜索。要配置预资源,请在 <Resources> 元素内部嵌套一个 <PreResources> 元素,并具有以下属性:
属性 | 描述 |
---|---|
allowLinking |
如果此标志的值为 此属性仅适用于 注意:在 Windows 平台(或任何其他不区分大小写文件系统的操作系统)上,此标志不得设置为 true,因为它会禁用大小写敏感性检查,从而可能导致 JSP 源代码泄露等安全问题。 |
base |
标识要使用的资源所在的位置。此属性是 Tomcat 提供的 |
className |
要使用的实现的 Java 类名。此类必须实现 |
internalPath |
标识在 基础路径 内查找资源的位置。这通常仅用于 JAR 文件,当资源不在 JAR 的根目录时,例如资源 JAR 的情况。此属性是 Tomcat 提供的 |
readOnly |
如果为 |
webAppMount |
标识这些资源将在 Web 应用程序中可用的路径。对于 Tomcat 提供的 |
JAR 资源
JAR 资源(JarResources)在主资源之后但在后置资源(PostResources)之前被搜索。它们将按照定义的顺序被搜索。要配置 JAR 资源,请在 <Resources> 元素内部嵌套一个 <JarResources> 元素。配置属性与 预资源 相同。
在 Web 应用程序启动期间,JAR 扫描过程会检查已扫描的 JAR 中 /META-INF/resources
下的内容。如果找到,此静态内容将添加到 JAR 资源中。
后置资源(Post-resources)
后置资源(PostResources)在资源 JAR 之后被搜索。它们将按照定义的顺序被搜索。要配置后置资源,请在 <Resources> 元素内部嵌套一个 <PostResources> 元素。配置属性与 预资源 相同。
排序
除了上述资源集之外,标准实现还维护着类资源(ClassResources),它们表示映射到 /WEB-INF/classes
的 JAR 文件中包含的类。这使得其他组件可以通过一次调用来搜索类,而不是先搜索 /WEB-INF/classes
,然后再次搜索 /WEB-INF/lib
中的 JAR。Web 应用程序启动时,类资源会从映射到 /WEB-INF/lib
的 JAR 中填充。
因此,完整的搜索顺序是:
- 预资源(PreResources)
- 主资源(MainResources)
- 类资源(ClassResources)
- JAR 资源(JarResources)
- 后置资源(PostResources)
Web 应用程序启动时类资源和 JAR 资源的填充意味着需要注意正确添加基于 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>
由于这两个资源都是后置资源,可能预期 D:\Projects\external\classes
会在 D:\Projects\lib\library1.jar
之前被搜索类。然而,通过使用 FileResourceSet
添加 JAR,该 JAR 被映射到 /WEB-INF/lib
,并将在应用程序启动时与 /WEB-INF/lib
中的其他 JAR 一起处理。JAR 文件中的类将被添加到类资源中,这意味着它们将在 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
。
缓存策略
通过配置自定义缓存策略,可以对静态资源的缓存获得额外控制。要配置自定义缓存策略,请在 <Resources> 元素内部嵌套一个 <CacheStrategy> 元素,并具有以下属性:
属性 | 描述 |
---|---|
className |
要使用的实现的 Java 类名。此类必须实现 |
特殊功能
没有与 Resources 元素相关的特殊功能。