使用JSF2在上下文根目录之外包含资源

时间:2011-07-27 14:42:18

标签: jsf-2 richfaces

我目前正在将应用程序从JSF 1.2和Richfaces 3.3升级到JSF 2和Richfaces 4。

我在使用JSF2的新h:outputStylesheet组件

让我的应用程序包含样式表时遇到问题

这是我的旧代码:

<a4j:loadStyle src="resource:///com/testing/test/html/css/style.xcss" />


以下是我的新代码(不工作):

<h:outputStylesheet library="resource:///com/testing/test/html/css/" name="style.xcss" />


我尝试了各种各样的变化,但没有一个有效。 当使用firebugs css选项卡时,我收到一条消息说RES_NOT_FOUND。

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:3)

<h:outputStylesheet library="resource:///com/testing/test/html/css/" name="style.xcss" />

不会出于某种原因 - 库名称不是资源的位置,而是用于确定资源的位置。

JSF运行时服务资源的方式在第2章标题为“请求处理生命周期”的JSF 2.0规范中有详细说明。资源处理是在JSF的常用Execute和Render生命周期(用于服务View请求)的范围之外执行的。在运行时,与ResourceHandler关联的Application负责提供资源请求。

ResourceHandler使用基于路径的方法来查找请求。默认实现允许将资源放置在两个位置:

  • 在Web应用程序根目录中。带有标识符的资源必须放在Web应用程序根目录下的/resources目录中,作为/resources/<resourceIdentifier>
  • 在Classpath中。带有标识符的资源必须存在于META-INF/resources目录下的Classpath中,同样作为META-INF/resources/<resourceIdentifier>。在Web应用程序中,我注意到该目录应该是Web Application Root/WEB-INF/classes/META-INF/resources目录或父类加载器中某个目录下的META-INF/resources目录,或者甚至是目录中的JAR。类路径。显然,最后一个选项是由PrimeFaces等JSF 2库/框架承担的选项。

JSF规范还指定<resourceIdentifier>除了资源名称本身之外如何包含区域设置,库版本和资源版本。这在ResourceHandler API documentation

中以简明的方式处理
  

包装资源

     

ResourceHandler定义了基于路径的打包约定   资源。 ResourceHandler的默认实现必须支持   打包类路径或Web应用程序根目录中的资源。   请参阅链接中的spec散文文档的JSF.2.6.1部分   包装规范性规范概述   资源。

     

简而言之,默认实现必须支持打包资源   在路径

下的Web应用程序根目录中
resources/<resourceIdentifier>
     

相对于网络应用根。

     

对于默认实现,包装在类路径中的资源   必须位于JAR条目名称

META-INF/resources/<resourceIdentifier>
     

由若干段组成,指定为   如下:

[localePrefix/][libraryName/][libraryVersion/]resourceName[/resourceVersion]
     

resourceIdentifier中的所有段都不是相对路径,   例如'../otherLibraryName'。不需要实施   支持JAR的libraryVersion和resourceVersion段   包装盒。

     

请注意,resourceName是唯一必需的段。

通过以上方式,以下内容可能有效:

<h:outputStylesheet library="com/testing/test/html/css" name="style.xcss" />

前提是样式表style.xcss存在于位于上述两个区域之一的目录结构com/testing/test/html/css中。根据您需要将其放在上下文根之外,唯一可能的选项是Web Application Root/WEB-INF/classes/META-INF/resources或类路径中的任何其他合适的目录/ JAR(包含META-INF/resources目录。当然,假设RichFaces没有提供它自己的ResourceHandler实现;如果它确实提供了一个,你应该看看它如何扩展默认实现以允许将资源放在别处。


在Mojarra中,com.sun.faces.application.resource.ResourceHandlerImpl类扩展了ResourceHandler类。 ResourceHanderImpl使用com.sun.faces.application.resource.ResourceManager类来查找资源。反过来,ResourceManager将资源加载委托给com.sun.faces.application.resource.WebappResourceHelpercom.sun.faces.application.resource.ClasspathResourceHelper类。顾名思义,前者负责查找Web应用程序根目录中的资源,而前者负责从类路径中加载资源。通过这些类,可以发现加载库的失败尝试记录在服务器的日志中; RES_NOT_FOUND值不是由这些类生成的,而是由于渲染器负责生成页面输出。