Search code examples
htmljsfconditional-rendering

Conditional rendering of non-JSF components (plain vanilla HTML and template text)


I'm trying to conditionally render a <tr> therefore I cannot use <h:panelGroup> as it will render to <span> or <div>

My current (working) approach is the following:

<h:outputFormat rendered="#{negotiator.maySend}">
    <tr> my tr stuff </tr>
</h:outputFormat>

This works, but I'm not sure if that's the way to abuse <h:outputFormat> - before that I used <h:outputLabel> but this was rendered to <label> in IE.

I have also read the answers to this question, but as mentioned above, they won't work for me because of the <tr>: How to not render whole block in JSF?


Solution

  • I cannot use <h:panelGroup> as it will render to <span> or <div>

    Apparently you didn't test it carefully. The <h:panelGroup> won't render anything if you don't specify attributes which should end up in the client side, like layout, id, styleClass, etc.

    Thus, this should technically perfectly work fine.

    <h:panelGroup rendered="#{negotiator.maySend}">
        <tr> my tr stuff </tr>
    </h:panelGroup>
    

    However, better for the main purpose would be to use <ui:fragment>.

    <ui:fragment rendered="#{negotiator.maySend}">
        <tr> my tr stuff </tr>
    </ui:fragment>
    

    This is by the way also possible with <f:verbatim>, but this is deprecated since JSF 2.0 as it's designed specifically for usage in JSP.

    See also: