提问人:ErVeY 提问时间:8/10/2010 最后编辑:BalusCErVeY 更新时间:7/28/2015 访问量:30193
JSTL c:if 在 JSF h:dataTable 中不起作用
JSTL c:if doesn't work inside a JSF h:dataTable
问:
我试图在状态完成时有条件地将一个放入 a 中。<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>
但这不起作用,为什么会这样,我该如何解决?
答:
51赞
BalusC
8/10/2010
#1
JSTL 标记是在视图构建期间计算的,而不是在视图呈现期间计算的。您可以按如下方式可视化它:每当第一次创建视图树时,都会执行所有 JSTL 标记,结果是只有 JSF 组件的视图。每当渲染视图树时,所有 JSF 组件都会被执行,结果是 HTML。所以:JSF+JSTL 不会像你所期望的那样同步运行。JSTL 首先从上到下运行,将结果交给 JSF,然后轮到 JSF 再次从上到下运行。这可能会导致 JSF 迭代组件(如 UIData)出现意外结果,因为在 JSTL 运行时,行数据(在特定情况下是对象)不可用。#{item}
简而言之:使用 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>
评论