EL语法,用于检查集合是否包含特定的枚举值

时间:2016-02-22 16:22:41

标签: jsp enums el enumset

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

res_tags

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

public class Item {
    EnumSet<ItemType> itemTypeSet;

    ...

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

在我的JSP中,我想使用JSTL来查看项目是否具有特定的ItemType,我尝试使用以下三个片段,但我没有得到任何错误,也没有结果。我不确定为什么所有3个都失败了。有人可以解释一下,对于这3个案例中的每一个案例,为什么该计划不像我认为的那样工作,并提供了第四种工作方式:)?

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

重要的是<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> 枚举是公开的,而不是在另一个类中。它完全可以访问任何其他类,包括解析EL / JSTL / JSP的类。

请注意,迭代枚举中的所有值都可以正常工作:

ItemType

结果如下:

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

1 个答案:

答案 0 :(得分: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魔术。