如何在包含相同的XHTML JSF 2.0文件时避免命名空间冲突

时间:2012-02-10 09:46:56

标签: java-ee jsf-2 facelets

在我的JSF 2.0项目中,当我在单个父XHTML文件中包含两个相同的XHTML文件时,我得到名称空间冲突。我的目标是在单个页面上创建相同控件的仪表板,每个控件代表一个单独的上下文。

例如,在以下名为parent.xhtml的JSF文件(例如)中,我包含两个“仪表板”facelets:

<ui:define name="body">
    <p:panel id="ONE"  >
        <ui:include src="raceboardunit.xhtml"/>
    </p:panel>

    <p:panel id="TWO" >
        <ui:include src="raceboardunit.xhtml"/>
    </p:panel>
</ui:define>

简单来说,儿童facelet“raceboardunit.xhtml”如下:

<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
            xmlns:h="http://java.sun.com/jsf/html"
            xmlns:f="http://java.sun.com/jsf/core" 
            xmlns:p="http://primefaces.prime.com.tr/ui">

    <p:panel header="Dashboard" >
        <h:panelGrid columns="2">
            <h:outputLabel value="Event" for="idEvent}" />
            <h:outputLabel value="#raceBoardController.name}" id="idEvent" />
        </h:panelGrid>
    </p:panel>
</ui:composition>

问题是涉及输出标签 id =“idEvent”的碰撞,因为在parent.xhtml文件中,子facelet的两个包含具有相同的命名组件。

错误报告为:Component ID idEvent has already been found in the view.

错误的原因很明显,但在JSF 2.0应用程序中包含可变数量的相同组件以最大化代码重用的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

最简单但最丑陋的方式是将其包装在<f:subview>中,这基本上会引入新的UINamingContainer图层。

<p:panel id="ONE">
    <f:subview id="board1">
        <ui:include src="raceboardunit.xhtml"/>
    </f:subview>
</p:panel>
<p:panel id="TWO">
    <f:subview id="board2">
        <ui:include src="raceboardunit.xhtml"/>
    </f:subview>
</p:panel>

最好是将其作为标记文件或复合组件。

以下是一个如何将其看作标记文件的示例:

<p:panel id="ONE">
    <my:raceboardunit id="board1" />
</p:panel>
<p:panel id="TWO">
    <my:raceboardunit id="board2" />
</p:panel>

with in tag file

<h:outputLabel for="#{id}_idEvent" value="Event" />
<h:inputText id="#{id}_idEvent" value="#{raceBoardController.name}" />

(我认为你过分简化了问题中的例子,它没有任何意义;标签引用另一个标签?所以我也修复了它以使它有点意义。)

复合组件与标记文件的用法基本相同,但本身隐式已经是UINamingContainer,因此您无需在复合组件实现中手动添加ID。

<h:outputLabel for="idEvent" value="Event" />
<h:inputText id="idEvent" value="#{raceBoardController.name}" />

另见: