简体   繁体   中英

JSF Component IDs ignored when dynamically generating Views

I ran into a bit of a problem.

I generate Views dynamically by iterating a list of strings via the c:forEach tag and then including them via the facelets include tag.

This works fine for building the layout but shows some strange behaviour.

I have a primefaces tabview containing 2 tabs. For the first Tab (the one that gets initially displayed) the component id is set (eg. tabview:categoryTab) but that's not the case for eg the second tab, here I only get tabview: for the component id (but it actually should be tabview:usrTab)

Why does JSF override the id I set for the second Tab? Am I missing some crucial information from the spec?

I use JSF 2 with Primefaces 3.6 (snapshot build) (And yes, I use the snapshot build on purpose and have tested this with stable PF releases as well but the same behaviour occurs)


edit

Code: 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;   
    }

    ....

}

This gets generated:

<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>

So, to reiterate: Only the id for the first tab is retained, the ids for the other tabs are generated despite being set in the xhtml code...

I ran into something very similar with Richfaces 4 and JSF 2. I managed to hack around it by including an EL expression in the id attribute. For me

<h:form id="staticName"> 

was being rendered into

<form id="j_idblah>

but once I did

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

it began rendering properly. Pretty hacky, but for now it'll work. Good luck!!

I ran into the same problem when including facelets with ac:forEach loop.

What worked for me was specifying the Ids as EL-Constants: id="#{'address_street'}"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM