gpt4 book ai didi

jsf - JSTL c :if doesn't work inside a JSF h:dataTable

转载 作者:行者123 更新时间:2023-12-02 10:43:41 26 4
gpt4 key购买 nike

我正在尝试使用<c:if>有条件地放置 <h:outputLink>里面 <h:dataTable>当状态完成时。

<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 标记是在构建 View 期间而不是渲染 View 期间评估的。您可以将其可视化如下:每当第一次创建 View 树时,所有 JSTL 标记都会被执行,结果是一个仅包含 JSF 组件的 View 。每当渲染 View 树时,所有 JSF 组件都会被执行,结果是 HTML。因此:JSF+JSTL 并不像您期望的编码那样同步运行。 JSTL先从上到下运行,将结果交给JSF,然后轮到JSF再从上到下运行。这可能会导致 JSF 迭代 UIData 等组件出现意外结果,因为行数据(在您的特定情况下为 #{item} 对象)在 JSTL 运行时可用。

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

您想在此处使用 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>

另请参阅:

关于jsf - JSTL c :if doesn't work inside a JSF h:dataTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3442380/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com