JSF规范2.2(2013-03-20)在第10.3.3.1项(声明用于Facelet页面的复合组件库)中说:
如果在XHTML页面中声明了facelet taglibrary,其名称空间以字符串开头 “http://java.sun.com/jsf/composite/”(不带引号),名称空间声明的其余部分 被视为资源库的名称[...]
如果“http://java.sun.com/jsf/composite/”后面的子字符串包含“/”字符,或者任何不符合库名称的字符,则必须执行以下操作。如果application.getProjectStage()是Development,则必须在页面中放置信息性错误消息并进行记录。否则,必须仅记录消息。
这意味着拥有以下文件夹结构是违法的:
resources
components
system
something_specific
something_even_more_specific
并参考图书馆名称“http://java.sun.com/jsf/composite/components/something_specific”?这是对的吗?
这似乎是一个奇怪的限制。我希望我的资料来源结构化,而不是在一个巨大的块状结合在一起。
这样的分层库实际上可以在Wildfly 8.0.0.CR1中运行,但我不确定依赖这种行为是否明智。
欢迎提供“最佳做法”的答案。
答案 0 :(得分:2)
我将总结我的发现。
来源:JSF spec issue 740,discussion preceding issue 740,another discussion,JSF spec issue 1141,discussion preceding issue 1141。
不允许删除库名称中的斜杠。允许在资源名称中删除。
在Mojarra 2.2.5实践中,复合组件库只适用于XHTML名称空间声明和taglib的<composite-library-name>components/system</composite-library-name>
。我希望在未来的Mojarra和/或JSF规范版本中仍然可以破解。如果你使用它,那么你就是JSF spec / impl开发人员的怜悯。链接的问题和讨论表明他们愿意保留向后兼容性,即使对于非预期的功能也是如此。
在MyFaces中有一个特殊设置,org.apache.myfaces.STRICT_JSF_2_ALLOW_SLASH_LIBRARY_NAME(MyFaces issue 3454)。我希望依赖于名称中带有斜杠的资源库,使用此设置可能会破坏某些功能,例如JSF资源版本控制(如何知道哪个部分是库名称以及哪个部分属于资源名称?)。
我认为复合组件库层次结构可以通过逐个导入taglib中的组件来实现:
<tag>
<tag-name>test</tag-name>
<component>
<resource-id>
components/system/test.xhtml
</resource-id>
</component>
</tag>
因此库名有效地成为“组件”,资源名称变为“system / test.xhtml”。
答案 1 :(得分:0)
将名称空间声明的其余部分视为资源库的名称
http://java.sun.com/jsf/composite/components/system
必须与/resources/components/system
任何不符合图书馆名称的字符
如果您声明http://java.sun.com/jsf/composite/components/system2
且/resources/components/system2
不存在,请采取措施
Warning: This page calls for XML namespace http://java.sun.com/jsf/composite/components/system2 declared with prefix y but no taglibrary exists for that namespace.
因此宣布
是绝对合法的xmlns:x="http://java.sun.com/jsf/composite/components/system"
和/ resources
下存在的任何其他文件夹结构