【问题标题】:<c:if test> seems to always evaluate true in JSF2 Facelets<c:if test> 在 JSF2 Facelets 中似乎总是评估为真
【发布时间】:2011-03-21 02:58:45
【问题描述】:

我在 Facelets 上使用 JSF2。

我在一个页面中定义了一个&lt;ui:param&gt;

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

ui.xhtml 模板中我有:

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

但是,&lt;c:if test&gt; 似乎总是评估 true,即使未指定 &lt;ui:param&gt;。如何更改代码,以便 &lt;c:if test&gt; 在未指定 &lt;ui:param&gt; 时实际评估 false

【问题讨论】:

    标签: jsf jsf-2 jstl facelets


    【解决方案1】:

    嗯,

    我改用rendered,就像这样:

    <h:panelGroup rendered="#{title!=null}">
    
                    <h1>#{title}</h1>
    
            </h:panelGroup>
    

    【讨论】:

    • 没试过 :-) 很好奇有什么缺点或者为什么它被认为是不好的做法。如果我可以试试会更新。
    • 我认为它被否决了,因为 !null 不检查为空。
    【解决方案2】:

    XML 命名空间无效。应该是

    xmlns:c="http://java.sun.com/jsp/jstl/core"
    

    是的,令人惊讶的是 URI 中的 /jsp 部分!没有/jsp 的那个只适用于 JSF 1.x 的 Facelets 1.x。如果您在网络浏览器中检查了生成的 HTML 输出,您应该也注意到&lt;c:if&gt; 在 HTML 输出中未被解析。


    也就是说,你应该更喜欢 JSF 组件而不是 JSTL 标记,除非技术上不可能(即当你真正想要控制视图的 构建,而不是 渲染看法)。您发现自己的h:panelGroup 是一个不错的选择,但是ui:fragment 是一个更好的选择,因为它的开销更少。

    <ui:fragment rendered="#{not empty title}">
        <h1>#{title}</h1>
    </ui:fragment>
    

    请注意,由于 JSF 家伙在初始 JSF 2.0 版本的 &lt;ui:fragment&gt; 标签定义文件中的错误,Netbeans 会猛烈地认为该标签不支持 rendered 属性,但这是不正确的。它当然支持它。它已在 JSF 2.1 标签定义中得到修复。

    另见:

    【讨论】:

    • 我使用h:panelGroup 只是为了它的rendered 属性;我不知道ui:fragment!这大大提高了性能并减少了在我有条件地在ui:repeats 中对大型集合进行渲染的地方生成的 HTML 数量。谢谢!我从你的每一个答案中学到了一些新东西,@BalusC。
    • @Nick:不客气。请注意,当没有指定应在 HTML 中结束的属性时,&lt;h:panelGroup&gt; 已经有效地不呈现任何内容,例如id。但实际上,&lt;ui:fragment&gt; 节省了 一些 UIComponent 编码开销(恕我直言,为了唯一的目的,自我记录更多)。
    • 奇怪,我可以发誓我看到 &lt;h:panelGroup&gt; 在 html 中呈现一个空的 &lt;span&gt; 标记,即使它的唯一属性是评估为假的 rendered,但我现在没看到...
    • 我试图将它添加到我的 index.xhtml 文件的顶部,但现在我收到一个 java.lang.NullPointerException 错误,而其他信息真的不多。你知道为什么会这样吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    相关资源
    最近更新 更多