c:如果测试eq总是返回true

时间:2013-11-28 11:13:09

标签: jsf jstl

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

<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的变量引用。

但它始终显示为真,即使两个值都不同。这是怎么造成的,我该如何解决?

1 个答案:

答案 0 :(得分:1)

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

因此,在效果方面,JSTL #{o}在视图构建期间运行时,<c:if> 可用。您应该使用具有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>

注意:这不会影响<c:set>。它只是为EL表达式创建一个“别名”,它不会立即评估EL表达式,因此<c:set>在这里是完全安全的,尽管有些不必要,因为该值不代表这种复杂的EL表达式。

另见: