我目前正在将应用程序从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。
有什么想法吗?
由于
答案 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
使用基于路径的方法来查找请求。默认实现允许将资源放置在两个位置:
/resources
目录中,作为/resources/<resourceIdentifier>
。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.WebappResourceHelper
和com.sun.faces.application.resource.ClasspathResourceHelper
类。顾名思义,前者负责查找Web应用程序根目录中的资源,而前者负责从类路径中加载资源。通过这些类,可以发现加载库的失败尝试记录在服务器的日志中; RES_NOT_FOUND
值不是由这些类生成的,而是由于渲染器负责生成页面输出。