JSTL c:如果在JSF h:dataTable中不起作用

我试图在状态完成时使用<c:if>来有条件地在<h:dataTable>放置一个<h:outputLink>

 <h:dataTable value="#{bean.items}" var="item" width="80%"> <h:column> <f:facet name="header"> <h:outputText value="State" /> </f:facet> <c:if test="#{item.state != 'Finish'}"> <h:outputText value="Missing value" /> </c:if> <c:if test="#{item.state == 'Finish'}"> <h:outputLink value="myLink"> <h:outputText value="Value = #{item.state}" /> </h:outputLink> </c:if> </h:column> </h:dataTable> 

但是这不起作用,为什么是这样,我该如何解决?

JSTL标签在构build视图时被评估,而不是在视图的渲染过程中。 您可以按如下方式对其进行可视化:每当首次创build视图树时,将执行所有JSTL标记,并且结果是仅包含JSF组件的视图。 每当一个视图树被渲染时,所有的JSF组件都被执行,结果是HTML。 所以:JSF + JSTL不会像编码期望的那样同步运行。 JSTL首先从上到下运行,然后把结果交给JSF,然后再由JSF自上而下运行。 这可能会导致像UIData这样的JSF迭代组件产生意想不到的结果,因为在JSTL运行时行数据(在特殊情况下为#{item}对象) 不可用。

简而言之:使用JSTL来控制JSF组件树的构buildstream程。 使用JSF来控制HTML输出生成的stream程。

你想在这里使用rendered属性。

 <h:outputText value="Missing value" rendered="#{item.state ne 'Finish'}" /> <h:outputLink value="myLink" rendered="#{item.state eq 'Finish'}"> <h:outputText value="Value = #{item.state}" /> </h:outputLink> 

也可以看看:

  • JSF2 Facelets中的JSTL …有意义吗?
  • 有条件地显示JSF组件