【问题标题】:c:if test eq always returning truec:if test eq 总是返回 true
【发布时间】:2013-11-28 11:13:08
【问题描述】:

我必须检查插入日期和修改日期值,它们都是字符串。如果它们相等,那么我将不会显示已编辑的电子邮件,否则我也会显示已编辑的电子邮件。所以我使用下面的代码来验证它。

<b>Created By - </b><h:outputText value="#{o.createdEmail}" /> : <h:outputText value="#{o.createdDateTime}" /><br/>                             
                                    <c:set var="createdDate" value="#{o.createdDateTime}"/>
                                    <c:set var="modifiedDate" value="#{o.modifiedDateTime}"/>
                                    <c:if test="#{createdDate eq modifiedDate}">
                                        <b>Edited By - </b><h:outputText value="#{o.lastModifiedEmail}" /> : <h:outputText value="#{o.lastModifiedDateTime}" />
                                    </c:if>

注意:o 是引用后端 bean 的变量。

但即使两个值不同,它也始终显示为 true。这是如何引起的,我该如何解决?

【问题讨论】:

    标签: jsf jstl


    【解决方案1】:

    考虑到代码的编写方式(名称为o 的托管bean 完全没有意义),我有根据地猜测#{o} 被声明为var&lt;h:dataTable&gt;&lt;ui:repeat&gt;。如果确实如此,那将完全解释这些症状。 JSTL 标记在视图构建期间运行,即基于 XHTML 源代码构建 JSF 组件树的时刻。但是,&lt;h:dataTable&gt;&lt;ui:repeat&gt; 等 JSF 组件在视图呈现期间运行,此时 JSF 组件树需要生成 HTML 输出。

    因此,实际上,#{o} 在视图构建期间运行 JSTL &lt;c:if&gt;可用。相反,您应该使用具有 rendered 属性的 JSF 组件,该属性在视图渲染期间运行,与 #{o} 相同的时刻根据当前迭代轮被放入 EL 变量范围。

    <ui:fragment rendered="#{createdDate eq modifiedDate}">
        <b>Edited By - </b><h:outputText value="#{o.lastModifiedEmail}" /> : <h:outputText value="#{o.lastModifiedDateTime}" />
    </ui:fragment>
    

    注意:这不会影响&lt;c:set&gt;。它只是为 EL 表达式创建一个“别名”,它不会立即计算 EL 表达式,因此 &lt;c:set&gt; 在这里是完全安全的,尽管有点不必要,因为该值并不代表如此复杂的 EL 表达式。

    另见:

    【讨论】:

    • Great BalusC 它解决了我的问题。还有很好的解释。我现在正在深入研究 jsf 生命周期。
    猜你喜欢
    • 2018-05-10
    • 2014-12-20
    • 2013-08-06
    • 2017-05-10
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多