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

Dan*_*ton 16 jsf facelets composition jsf-2

我有一个<ui:composition>包含一些带有显式id的元素和一些引用这些id进行部分处理/更新的ajax事件.我将xhtml的这个片段封装在组合中,这样我就可以在几个不同的地方使用它,而不必复制代码.但是,当我<ui:include>在页面中多次使用合成(with )时,我会得到重复的id异常.似乎JSF没有将每个组合包装在它自己的命名容器中(就像<ui:component>那样).

有没有一种简单的方法将我的作品包装在自己的命名容器中?或者,每次我想在公共命名容器中重用xhtml片段时,是否必须使用复合组件?

Bal*_*usC 31

根据<ui:include>模板的用途,您有以下几种选择:

  1. 使用<f:subview>.它创建另一个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>
    
    Run Code Online (Sandbox Code Playgroud)

    definied中的成分some.xhtml最终将分别获得top:bottom:在他们的ID前缀.


  2. 把它变成一个TAGFILE需要的id属性.

    <my:some id="top" />
    ...
    <my:some id="bottom" />
    
    Run Code Online (Sandbox Code Playgroud)

    并使用该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>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 把它变成一个复合组件.复合组件本质上已经是a NamingContainer,因此它们的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"
    >
        ...
    <ui:composition>
    
    Run Code Online (Sandbox Code Playgroud)

    通过

    <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>
    
    Run Code Online (Sandbox Code Playgroud)

    这样您可以按如下方式使用它:

    <my:some id="top" />
    ...
    <my:some id="bottom" />
    
    Run Code Online (Sandbox Code Playgroud)

    definied中的成分<cc:implementation>最终将分别获得top:bottom:在他们的ID前缀(再次指出,复合材料组件的id属性是可选的,JSF将自动生成,否则一个).


也可以看看:


elb*_*ild 5

当您包含多次相同时ui:composition,ID将被复制.解决方案是指定一个特定ui:param的内容ui:include.

假设你包含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>
Run Code Online (Sandbox Code Playgroud)

然后在mycomposition.xhtml中你应该声明id如下(例如啊:outputText):

<h:outputText id="#{idPrefix}_text" value="My Awesome Text here"/>
Run Code Online (Sandbox Code Playgroud)

现在,您可以在其余页面中引用id作为#{idPrefix}_text.