【问题标题】:Using <c:when> with an enumeration将 <c:when> 与枚举一起使用
【发布时间】:2011-07-02 21:44:59
【问题描述】:

我有一个 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。 有人告诉我将枚举与字符串进行比较并使用 == 运算符,但也许不是这样。

所以,我的问题是:如何使用&amp;lt;c:when&amp;gt; 标签来比较一个属性和一个枚举值?

【问题讨论】:

    标签: java jsp jsf enums el


    【解决方案1】:

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

    那么 JSTL 确实是行不通的。它在视图构建期间运行,而不是在视图渲染期间运行。基本上你可以把它想象成这样:JSTL首先从上到下运行,然后将生成的包含JSF标签的结果只交给JSF,JSF又从上到下运行。在 JSTL 遇到迭代的 JSF 数据表 #{item} 时,它是 null,因此它将始终评估 false,并且 JSF 不会从 JSTL 检索这些图像。

    您想改用 JSF 标记。我建议将&lt;h:graphicImage&gt;rendered 属性结合使用。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 2017-12-08
        相关资源
        最近更新 更多