我有一个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>
答案 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魔术。