【问题标题】:Compare enum values in JSP比较 JSP 中的枚举值
【发布时间】:2018-03-08 08:52:21
【问题描述】:

我创建了一个enum,它看起来像:

public enum BtsMode {
    PROJECT_BTS("project_bts"), SERVICE_BTS("service_bts");

    private String mode;

    private BtsMode(String mode) {
        this.mode = mode;
    }

    public String getMode() {
        return mode;
    }

    public static BtsMode getBtsMode(Integer projectId) {
        return projectId == 0 ? BtsMode.SERVICE_BTS : BtsMode.PROJECT_BTS;
    }
};

此枚举是包含其他应用程序级常量的类的一部分。 基于projectId 值,我在Spring/java 应用程序中执行其他操作。在 UI 方面,我希望使用相同的 enum 来比较 BtsMode 类型并进行操作。网上搜了一圈,发现可以遍历enum进行比较,但要查看具体的BtsMode类型。

使用getBtsMode() 方法,我得到了适当的BtsMode 并将其设置为Spring ModelMap 属性。

BtsMode btsMode = BtsMode.getBtsMode(projectId);
modelMap.addAttribute("curBtsMode", btsMode);

在JSP 中,我想根据BtsMode 显示隐藏内容。像这样的,

<c:choose>
    <c:when test="${curBtsMode eq BtsMode.PROJECT_BTS}">
        <%-- Display elements specific to PROJECT_BTS --%>          
    </c:when>
    <c:when test="${curBtsMode eq BtsMode.SERVICE_BTS}">
        <%-- Display elements specific to SERVICE_BTS --%>          
    </c:when>
</c:choose>

我不想使用 scriptlet,因为我们不会在我们的应用程序中使用它们。有没有其他方法可以做到这一点?

临时解决方案

目前,由于 BtsMode 枚举只有两个值,我可以通过在 modelMap 中设置来使用它:

modelMap.addAttribute("projBtsMode", BtsMode.PROJECT_BTS);
modelMap.addAttribute("serviceBtsMode", BtsMode.SERVICE_BTS);

并在 JSP 中访问:

<c:if test="${curBtsMode eq projBtsMode}">

这很好用,但如果有更好的解决方案,我将不胜感激。

【问题讨论】:

    标签: java spring enums jstl


    【解决方案1】:

    只要您使用至少 3.0 版的 EL,那么您可以将常量导入到您的页面中,如下所示:

    <%@ page import="org.example.Status" %>
    <c:when test="${dp.status eq Status.VALID}">
    

    有些 IDE 不理解这一点,所以使用替代方法。

    辅助方法

      public enum Status { 
      VALID("valid")
    
      private final String val;
    
      Status(String val) {
        this.val = val;
      }
    
      public String getStatus() {
        return val;
      }
    
      public boolean isValid() {
        return this == VALID;
      }
    
    }
    

    JSP:

    <c:when test="${dp.status.valid}">
    

    【讨论】:

      【解决方案2】:

      尝试使用简单的字符串:

      <c:when test="${curBtsMode  == 'PROJECT_BTS'}">
          <%-- Display elements specific to PROJECT_BTS --%>          
      </c:when>
      <c:when test="${curBtsMode == 'SERVICE_BTS'}">
          <%-- Display elements specific to SERVICE_BTS --%>          
      </c:when>
      

      【讨论】:

      • 感谢您的建议,我认为它是第一选择并且它有效,但我认为它超出了使用常量或枚举的目的。但是虽然它可以解决我会赞成的问题,但仍然觉得可能有更好的解决方案。谢谢! :)
      • 好吧,我承认我目前的回答有点违反枚举逻辑。我通常使用一个小脚本(如 )来规避问题。像这样的小脚本不会伤害(太多:))
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      相关资源
      最近更新 更多