JSTL c:if не работает внутри JSF h:dataTable
Я пытаюсь использовать <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>
Но это не работает, почему это и как я могу это исправить?
1 ответ
Теги JSTL оцениваются во время построения представления, а не во время визуализации представления. Вы можете визуализировать его следующим образом: всякий раз, когда дерево представлений создается впервые, все теги JSTL выполняются, и в результате получается представление только с компонентами JSF. Всякий раз, когда дерево представления отрисовывается, все компоненты 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>