使用带有枚举的<c:when> </c:when>

时间:2011-02-23 16:37:06

标签: java jsp jsf enums el

我有一个JSP portlet需要根据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属性的辅助bean。 我被告知要将枚举与字符串进行比较并使用==运算符,但可能不是这样。

所以,我的问题是:如何使用&lt;c:when&gt;标记将属性与枚举值进行比较?

2 个答案:

答案 0 :(得分:4)

  

... 项目对象(ICEFaces数据表中的 ...

然后JSTL确实不起作用。它在视图构建时运行,而不是在视图渲染时。基本上你可以将它可视化如下:JSTL首先从上到下运行,然后将包含JSF标记的生成结果仅交给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 :(得分:1)

也许只是我,但我不喜欢在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}" />