我必须检查插入日期和修改日期值,两者都是字符串。如果它们相等,那么我不会显示已编辑的电子邮件,否则我也会显示已编辑的电子邮件。所以我使用下面的代码来验证它。
<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的变量引用。
但它始终显示为真,即使两个值都不同。这是怎么造成的,我该如何解决?
答案 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表达式。