JSTL c: если не работает внутри JSF 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>

Но это не работает, почему это так и как я могу исправить это?

19
задан BalusC 21 July 2015 в 22:17
поделиться

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>

См. также:

49
ответ дан 30 November 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: