Search code examples
jsfjsf-2jstlrendered-attribute

JSF rendered and fragments


I'm facing a a problem with JSF, i have a fragment that is rendered on all pages, and displays the latest entries of a table (~ 10 items). And i want to reuse it on a page that lists all entries.

I put a rendered rule to prevent the all pages version of the element to appear on this page specifically, but still no go, I aways get a "duplicate id found in view" error. The problem seems to lay on the fact that the JSF processor validate the IDs before validating which ones will really be rendered.

Just for information, I'm using the end of the request URI to determine if rendered is True or False.

Ah, and I tried using c:if, but it was useless too.

Edit:

Sample code requested...

i have this xhtml fragment ("tableInclude.xhtml"):

<ui:composition
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"
    xmlns:p="http://primefaces.org/ui"
    xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
    <ui:fragment>
        <p:dataTable var="item" value="#{bean.items}"
                     emptyMessage="#{msg['table.empty']}"
                     widgetVar="table" id="listItems" styleClass="tableItems">
            <p:column styleClass="span1" style="text-align: center;">
                <f:facet name="header">
                    <i class='fa-icon-picture'/>
                </f:facet>
                <p:commandLink action="#{bean.itemSelected(item)}" value="#{item.name}"/>
            </p:column>
        </p:dataTable>
    </ui:fragment>
</ui:composition>

Then i run on every page this:

<ui:include src="./tableInclude.xhtml">

i tried to do this:

<ui:fragment rendered="#{request.requestURI != '/context/don't_render_here.xhtml'}">
    <ui:include src="./tableInclude.xhtml">
</ui:fragment>

But i still get the duplicated id error even so when i access the "don't_render_here.xhtml" page.


Solution

  • not the best solution, but a quick and dirty: replace ui:fragment with f:subView