动态生成视图时忽略JSF组件ID

时间:2013-03-17 23:42:23

标签: java jsf primefaces

我遇到了一些问题。

我通过c:forEach标记迭代字符串列表来动态生成视图 然后通过facelets包括它们包括标签。

这适用于构建布局但显示一些奇怪的行为。

我有一个包含2个标签的primefaces tabview。 对于第一个Tab(最初显示的那个),设置了组件id(例如tabview:categoryTab),但是不是这样的。第二个选项卡,这里我只得到tabview:对于组件ID(但它实际上应该是tabview:usrTab)

为什么JSF会覆盖我为第二个Tab设置的ID?我是否遗漏了规范中的一些重要信息?

我使用JSF 2和Primefaces 3.6(快照构建) (是的,我是故意使用快照构建的,并且已经使用稳定的PF版本对其进行了测试,但是会出现相同的行为)


修改

代码: admin.xhtml

<ui:composition template="/templates/commonLayout.xhtml">
    <ui:define name="content">
        <p:panel id="parentPanel">
            <h:outputText value="Verwaltung" />
            <br />
            <p:tabView id="tabview">
                <!-- insert marker -->
                <c:forEach items="#{adminTabs}" var="tab">
                    <ui:include src="#{tab}" />
                </c:forEach>
            </p:tabView>
        </p:panel>
    </ui:define>
</ui:composition>

catTab.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <p:tab title="Categories Tab" id="catTab">
            ....
    </p:tab>
</ui:composition>

usrTab.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <p:tab title="Users Tab" id="usrTab">
            ....
    </p:tab>
</ui:composition>

testTab.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <p:tab title="TestTab" id="testTab">
            ....
    </p:tab>
</ui:composition>

ContentProvider.java

 public class ContentProvider {
    ....

    @Produces
    @Named("adminTabs")
    public List<String> getTabs(){
        List<String> components = new ArrayList<String>();
        components.add("/templates/tabs/catTab.xhtml");
        components.add("/templates/tabs/usrTab.xhtml");
        components.add("/templates/tabs/testTab.xhtml");
        return components;   
    }

    ....

}

生成:

<ul class="ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" role="tablist">
<li class="ui-state-default ui-tabs-selected ui-state-active ui-corner-top" aria-expanded="true" role="tab">
<a href="#tabview:catTab">Categories</a>
</li>
<li class="ui-state-default ui-corner-top" aria-expanded="false" role="tab">
<a href="#tabview:j_idt31">TestTab</a>
</li>
<li class="ui-state-default ui-corner-top" aria-expanded="false" role="tab">
<a href="#tabview:j_idt32">Benutzer und Rollen</a>
</li>
</ul>

因此,重申一下:只保留第一个选项卡的id,尽管在xhtml代码中设置了其他选项卡的ID ...

2 个答案:

答案 0 :(得分:1)

我遇到了与Richfaces 4和JSF 2非常相似的东西。我设法通过在id属性中包含EL表达式来破解它。对我来说

<h:form id="staticName"> 

正在被渲染成

<form id="j_idblah>

但是一旦我做了

<h:form id="#{_objectInContext}">

它开始正确渲染。非常hacky,但现在它会工作。祝你好运!!

答案 1 :(得分:0)

在使用c:forEach循环包含facelets时遇到了同样的问题。

对我有用的是将Ids指定为EL常量:id =“#{'address_street'}”