I am using JSF2 on Facelets.
I define an <ui:param>
in a page:
<ui:composition template="/WEB-INF/templates/ui.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<ui:param name="title" value="OnAir WebDemo" />
...
</ui:composition>
in the ui.xhtml
template I have:
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jstl/core"
>
<c:if test="#{not empty title}">
<h1>#{title}</h1>
</c:if>
</html>
However, <c:if test>
seems to always evaluate true
, also if the <ui:param>
is not specified. How can I change the code so that <c:if test>
will actually evaluate false
when the <ui:param>
is not specified?
The XML namespace is invalid. It should be
xmlns:c="http://java.sun.com/jsp/jstl/core"
Yes, astonishingly with the /jsp
part in the URI! The one without /jsp
works only in Facelets 1.x for JSF 1.x. If you have checked the generated HTML output in the webbrowser, you should have noticed as well that the <c:if>
is left unparsed in the HTML output.
That said, you should prefer JSF components over JSTL tags, unless technically impossible (i.e. when you actually want to control the building of the view, not rendering of the view). The h:panelGroup
as you found out yourself is a good candidate, however the ui:fragment
is a nicer choice since it has less overhead.
<ui:fragment rendered="#{not empty title}">
<h1>#{title}</h1>
</ui:fragment>
Note that due to a mistake of the JSF guys in the <ui:fragment>
tag definition file of the initial JSF 2.0 version, Netbeans will jerk that the tag doesn't support the rendered
attribute, but this is untrue. It certainly supports it. It has been fixed in JSF 2.1 tag definition.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With