在同一个命名容器中重复使用facelets组合时避免重复的id
我有一个<ui:composition>
,它包含一些带有显式id和一些引用这些id的部分处理/更新的ajax事件。 我把这个xhtml片段封装在组合中,所以我可以在几个不同的地方使用它,而不必复制代码。 但是,当我在页面中多次使用组合( <ui:include>
)时,会出现重复的idexception。 看来JSF并没有将每个组合包装在自己的命名容器中(比如<ui:component>
)。
有一个简单的方法来包装我的作品在自己的命名容器? 或者每次我想在通用的命名容器中重用xhtml片段时,都必须使用复合组件?
根据<ui:include>
模板的用途,您有几个select:
-
使用
<f:subview>
。 它创build了另一个NamingContainer
上下文(比如<h:form>
,<h:dataTable>
,以及所有的朋友):<f:subview id="top"> <ui:include src="/WEB-INF/includes/some.xhtml" /> </f:subview> ... <f:subview id="bottom"> <ui:include src="/WEB-INF/includes/some.xhtml" /> </f:subview>
在some.xhtml中
some.xhtml
的组件将最终在其ID中分别获得top:
和bottom:
前缀。
-
把它变成一个需要
id
属性的标签文件。<my:some id="top" /> ... <my:some id="bottom" />
并使用该ID来标识组合中组件的ID。
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" > ... <h:someComponent id="#{id}_some" /> <h:otherComponent id="#{id}_other" /> ... <ui:composition>
-
把它变成一个复合组件 。 复合组件本质上已经是一个
NamingContainer
,所以它们的id
属性是可选的。 基本上,replace<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" > ... <ui:composition>
通过
<ui:component xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:cc="http://java.sun.com/jsf/composite" > <cc:interface> <!-- This is optional. --> </cc:interface> <cc:implementation> ... <h:someComponent id="some" /> <h:otherComponent id="other" /> ... </cc:implementation> <ui:component>
这样你可以使用它如下:
<my:some id="top" /> ... <my:some id="bottom" />
在
<cc:implementation>
的组件最终将在它们的ID中分别得到top:
和bottom:
前缀(再次注意,复合组件的id
属性是可选的,否则JSF将自动生成一个)。
也可以看看:
- 何时使用<ui:include>,标记文件,复合组件和/或自定义组件?
当你包含不止一次相同的ui:composition
的ID是重复的。 解决方法是在ui:include
指定一个特定的ui:param
。
假设你包含mycomposition.xhtml,你可以做类似的事情:
<ui:include src="mycomposition.xhtml"> <ui:param name="idPrefix" value="first"/> </ui:include> ... <ui:include src="mycomposition.xhtml"> <ui:param name="idPrefix" value="second"/> </ui:include>
然后在mycomposition.xhtml中,你应该声明如下的id(例如ah:outputText):
<h:outputText id="#{idPrefix}_text" value="My Awesome Text here"/>
现在,您可以在#{idPrefix}_text
页面的其余部分以#{idPrefix}_text
引用id。