【问题标题】:EL syntax to check if a set contains a specific Enum value检查集合是否包含特定枚举值的 EL 语法
【发布时间】:2016-06-04 04:14:51
【问题描述】:

我有一个 Item 对象,它有一个字段是一组 ItemTypes:

public class Item {
    EnumSet<ItemType> itemTypeSet;

    ...

    public Set<ItemType> getItemTypeSet(){
        return this.itemTypeSet;
    }
}

ItemType 当然是一个简单的枚举。

public Enum ItemType {
    BOLD, THIN, COOL, ROUND;
}

在我的 JSP 中,我想使用 JSTL 来查看一个项目是否具有特定的 ItemType,我尝试使用以下三个 sn-ps,但我没有收到任何错误,也没有结果。我不确定为什么所有三个都失败了。有人可以解释一下,对于这 3 种情况,为什么该程序不像我认为的那样运行,并提供第 4 种可行的替代方案:)?

<c:if test="${item.itemTypeSet.contains('BOLD')}">
    Method 1 works!
</c:if>
<c:if test="${item.itemTypeSet.contains(ItemType.valueOf('BOLD'))}">
    Method 2 works!
</c:if>
<c:if test="${item.itemTypeSet.contains(ItemType.BOLD)}">
    Method 3 works!
</c:if>

重要的是 ItemType 枚举是公共​​的,而不是在另一个类中。任何其他类都可以完全访问它,包括解析 EL/JSTL/JSP 的类。

请注意,遍历枚举集中的所有值都可以正常工作:

<c:forEach items="${item.itemTypeSet}" var="itemType">
    <p>${itemType}</p>
</c:forEach>

给出结果:

BOLD
ROUND

【问题讨论】:

  • 对于方法3,你做了&lt;@page import="com.example.ItemType" %&gt;吗? (但仅适用于支持 EL 3.0 的容器(Tomcat 8 等)
  • 我试过了,但效果不大。它也没有给出任何错误。我正在使用 JBoss 6.4,我猜它有 EL 2.2...
  • 你有'在方法三你应该删除它
  • @achabahe 这只是一个错字,它实际上不在代码中。我编辑了我的帖子。

标签: jsp enums el enumset


【解决方案1】:

方法 3 将在 EL 3.0(Tomcat 8、WildFly 8、GlassFish 4 等和更新版本)中工作,前提是您按照 How to reference constants in EL? 中的说明在 JSP 页面上下文中导入枚举

<@page import="com.example.ItemType" %>

理论上,方法 2 也应该在 EL 3.0 中工作,但与 3 相比,它比较笨拙。

方法 1 根本不起作用,因为 EL 不知道集合的泛型类型,并且由于 ${'...'} 语法仍然假定它是普通的 String。基本上,它在做"BOLD".equals(BOLD) 永远不会通过的封面。

您最好在此基础上创建一个自定义 EL 函数。有关自定义 EL 函数的启动示例,请访问此相关问题的答案:How can i do a multiselect in jsp/jstl with selected value?您希望得到如下结果:

<c:if test="${my:containsEnum(item.itemTypeSet, 'BOLD')}">

并在 containsEnum(Set, String) 函数中相应地执行 Java 魔法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2011-06-23
    • 2012-08-30
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多