Использование ‹c:when› с перечислением

У меня есть портлет JSP, который должен отображать различную разметку в соответствии со значением свойства bean-компонента, которое имеет тип перечисления.

public enum State {
    CANCELED, COMPLETED
}

Я использовал следующий код для переключения

<c:choose>
    <c:when test="#{item.state == 'COMPLETED'}">
        <img src="ok.gif" />
    </c:when>
    <c:when test="#{item.state == 'CANCELED'}">
        <img src="ko.gif" />
    </c:when>
</c:choose>

но это не работает. Интересно, что в обоих случаях он возвращает false. Объект item (внутри таблицы данных ICEFaces) — это вспомогательный компонент со свойством State getter+setter. Мне сказали сравнить перечисление со строкой и использовать оператор ==, но, возможно, это не так.

Итак, мой вопрос: как использовать тег &lt;c:when&gt; для сравнения свойства со значением перечисления?


person usr-local-ΕΨΗΕΛΩΝ    schedule 23.02.2011    source источник


Ответы (2)


... Объект элемента (внутри таблицы данных ICEFaces) ...

Тогда JSTL действительно не работает. Он запускается во время сборки представления, а не во время рендеринга представления. В основном вы можете визуализировать это следующим образом: JSTL сначала выполняется сверху вниз, а затем передает сгенерированный результат, содержащий теги JSF, только JSF, который, в свою очередь, снова выполняется сверху вниз. В тот момент, когда JSTL встречает итерированную таблицу данных JSF #{item}, это null, и поэтому он всегда будет оценивать false, и JSF не будет получать ни одно из этих изображений из JSTL.

Вместо этого вы хотите использовать тег JSF. Я бы предложил <h:graphicImage> в сочетании с атрибутом rendered.

<h:graphicImage value="ok.gif" rendered="#{item.state == 'COMPLETED'}" />
<h:graphicImage value="ko.gif" rendered="#{item.state == 'CANCELED'}" />
person BalusC    schedule 23.02.2011

Возможно, это только я, но я не люблю сравнивать строки в тегах jsp. Вместо этого я бы предоставил методы сравнения, подобные следующим:

public boolean isStateCompleted()
{
    return State.COMPLETED.equals(state);
}

public boolean isStateCanceled()
{
    return State.CANCELED.equals(state);
}

И я бы ссылался на них в jsp следующим образом:

<c:choose>
    <c:when test="#{item.stateCompleted}">
        <img src="ok.gif" />
    </c:when>
    <c:when test="#{item.stateCanceled}">
        <img src="ko.gif" />
    </c:when>
</c:choose>

или вот так:

<h:graphicImage value="ok.gif" rendered="#{item.stateCompleted}" />
<h:graphicImage value="ko.gif" rendered="#{item.stateCanceled}" />  
person DwB    schedule 23.02.2011