С помощьюс перечислением - PullRequest
1 голос
/ 23 февраля 2011

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

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; для сравнениясвойство для значения перечисления?

Ответы [ 2 ]

4 голосов
/ 23 февраля 2011

... Объект item ( внутри таблицы данных 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'}" />
1 голос
/ 23 февраля 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}" />  
...