在同一个命名容器中重复使用facelets组合时避免重复的id

我有一个<ui:composition> ,它包含一些带有显式id和一些引用这些id的部分处理/更新的ajax事件。 我把这个xhtml片段封装在组合中,所以我可以在几个不同的地方使用它,而不必复制代码。 但是,当我在页面中多次使用组合( <ui:include> )时,会出现重复的idexception。 看来JSF并没有将每个组合包装在自己的命名容器中(比如<ui:component> )。

有一个简单的方法来包装我的作品在自己的命名容器? 或者每次我想在通用的命名容器中重用xhtml片段时,都必须使用复合组件?

根据<ui:include>模板的用途,您有几个select:

  1. 使用<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:前缀。


  2. 把它变成一个需要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> 

  3. 把它变成一个复合组件 。 复合组件本质上已经是一个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。