JavaServer Pages 静态文件访问的 Web 容器配置
Web 容器根据应用程序配置,在多达四个不同的位置搜索静态文件和 JavaServer Pages (JSP) 文件。此搜索将找到适当的资源,来处理入站请求和从以下 API 返回的结果:
URL ServletContext.getResource(String path)
Set ServletContext.getResourcePaths(String path)
注意: 仅在启用了fileServing属性时搜索静态文件,应用程序不会包含 /* servlet
映射。此外,除了在 web.xml 文件中定义的任何其他模式,JSP 文件还包括具有以下扩展名的文件
- .jsp
- .jspx
- .jsw
- .jsv
具有优先级顺序的四个位置如下所示:
- 应用程序 WAR 目录
- Web 容器首先在应用程序 WAR 目录中搜索请求的资源。但是,您不能为入站请求处理 WEB-INF 或者 META-INF 目录下的资源,尽管可以使用 getResource() 和 getResourcePaths() 方法来访问它们。
- 预分段文档根
- Web 容器接着会搜索任何应用程序定义的预分段文档根。在位于应用程序的 WEB-INF 目录中的 ibm-web-ext.xmi 文件中,定义预分段文档根。为静态文件或 JSP 文件定义预分段文档根,如下所示:
Static files: <fileServingAttributes xmi:id="<user-provided name>" name="preFragmentExtendedDocumentRoot" value="<user provided value>"/>
JSP files: <jspAttributes xmi:id="<user provided name>" name="preFragmentExtendedDocumentRoot" value=<user provided value>"/>
<user provided name> 可以是目录列表和/或 JAR 列表。例如:
如果 <user provided name> 仅包含目录列表,并且该目录包含 JAR 文件,那么它不会在这些 JAR 文件中执行搜索。它仅在该目录内但在所有 JAR 文件外搜索静态文件和 JSP 文件。如果静态文件或 JSP 文件在 JAR 中,那么这些静态文件或 JSP 文件不能位于该 JAR 文件的 META-INF 文件夹内(因为它是受限的文件夹),并且 <user provided name> 应该包含该 JAR 文件的完整路径。<fileServingAttributes name="extendedDocumentRoot" value="C:\EDR_directory,C:\my\path\to\jarEDR.jar"/>
注意: 预分段文档根是 WebSphere® Application Server V9.0 中的新功能。
- 应用程序 WAR 文件中 WEB-INF/Lib 目录下的片段的 META-INF/resources 目录
- Web 容器在搜索预分段文档根后,会搜索 Web 片段。Web 片段包含应用程序 WEB-INF/lib 目录中的 JAR 文件。该 JAR 可能包含 JAR 文件中定义的 META-INF/resources 目录中的静态资源。要防止 Web 容器搜索 META-INF/resources 目录,请将 com.ibm.ws.webcontainer.SkipMetaInfResourcesProcessing Web 容器定制属性设置为 true。此定制属性的缺省值为 false。
com.ibm.ws.webcontainer.SkipMetaInfResourcesProcessing = true
注意: 应用程序 WAR 文件中 WEB-INF/Lib 目录下的片段的 META-INF/resources 目录是 WebSphere Application ServerV9.0 中的新功能。
- 扩展文档根
- 最后,Web 容器会搜索定义为扩展文档根的任何应用程序。扩展文档根在先前发行版中可用,且在位于应用程序 WEB-INF 目录中的 ibm-web-ext.xmi 文件中定义。为静态文件或 JSP 文件定义扩展文档根,如下所示:
Static files: <fileServingAttributes xmi:id="<user provided name>" name="extendedDocumentRoot" value="<user provided value>"/>
JSP files: <jspAttributes xmi:id="<user provided name>" name="extendedDocumentRoot" value=<user provide value>"/>
com.ibm.ws.webcontainer.SkipMetaInfResourcesProcessing = true
<user provided name> 可以是目录列表和/或 JAR 列表。例如:
如果 <user provided name> 仅包含目录列表,并且该目录包含 JAR 文件,那么它不会在这些 JAR 文件中执行搜索。它仅在该目录内但在所有 JAR 文件外搜索静态文件和 JSP 文件。如果静态文件或 JSP 文件在 JAR 中,那么这些静态文件或 JSP 文件不能位于该 JAR 文件的 META-INF 文件夹内(因为它是受限的文件夹),并且 <user provided name> 应该包含该 JAR 文件的完整路径。<fileServingAttributes name="extendedDocumentRoot" value="C:\EDR_directory,C:\my\path\to\jarEDR.jar"/>
注意: 您可以将 com.ibm.ws.webcontainer.ServeWelcomeFileFromExtendedDocumentRoot 定制属性设置为true,以从静态文件扩展文档根启用服务静态欢迎页面。此定制属性的缺省值为 false。com.ibm.ws.webcontainer.ServeWelcomeFileFromExtendedDocumentRoot = true
当 com.ibm.ws.webcontainer.ServeWelcomeFileFromExtendedDocumentRoot 属性设置为true时, Web 容器会在静态文件扩展文档根中搜索静态欢迎文件,来为包含有效的部分 URL 的请求提供服务。例如,如果请求仅指定应用程序上下文,并且欢迎文件指定为 index.html,那么当从静态文件扩展文档中提供 index.html 时,必须设置此属性。
缺省值为false。com.ibm.ws.webcontainer.enablepartialurltoextendeddocumentroot = true
如果此属性设置为true,那么在确定入站请求是否是针对有效的部分 URL 时,Web 容器会包括静态文件扩展文档根的内容。例如,如果请求指定结尾为 /<application context>/<text> 和 <text> 的 URL 未映射至 servlet 或静态文件,那么仅当 <text> 是应用程序的有效目录时,Web 容器会认为此 URL 是有效的部分 URL。因此如果目录 <text> 仅存在于静态文件扩展文档根中,必须设置此属性,以使 URI 被视为有效部分 URI。
要点: 静态文件预分段文档根不需要这些属性。此外,确定有效部分 URL 时,Web 容器不会考虑 JSP 预分段和扩展文档根。