2

我有一个 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,我尝试使用以下三个片段,但没有得到任何错误和结果。我不确定为什么所有三个都失败了。有人可以解释一下,对于这三种情况,为什么该程序不像我认为的那样工作,并提供第四个可行的替代方案:)?

<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
4

1 回答 1

2

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

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

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

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

您最好在此创建一个自定义 EL 函数。有关自定义 EL 函数的启动示例,请参阅此相关问题的答案:如何在 jsp/jstl 中使用选定值进行多选?你希望得到这样的结果:

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

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

于 2016-02-22T17:58:18.757 回答