2009-10-11 31 views
10

我:交通地图<枚举,对象>在JSTL

public enum MyEnum{ 
    One, Two, Three 
} 

从控制器,我把模型:

HashMap<MyEnum, Long> map = new HashMap<MyEnum, Long>(); 
map.put(MyEnum.One, 1L); 
mav.addObject("map", map); 

如何在地图上做的我在JSTL访问对象关键枚举MyEnum.One,以一种整洁的方式?

${map['One']} //does not seem to work... 

也不

${map[MyEnum.One]} 

回答

11

你不能。最好的办法是改变你的地图使用enum.name()作为关键:

HashMap<String, Long> map = new HashMap<String, Long>(); 
map.put(MyEnum.One.name, 1L); 
map.addObject("map", map); 

你的第一个方法是有效的,那么:

${map['One']} // works now 

或者你可以编写自定义EL函数做如果你不能/不想改变地图,你可以在上面找到。

+0

使用自定义EL函数 - 其最维护的方式。 – Chii 2009-10-13 12:36:22

13

这是不完全真实的,你不能这样做,但解决的办法不是完全直线前进。问题是EL不转换你通过在地图键为您相应的枚举字符串,所以把$ {图[“一”]}不使用枚举常量MyEnum.One在地图上查找。

我遇到同样的问题,并没有想要恢复到一个字符串加密映射去,所以当时面临的挑战是在JSTL如何获得实际的枚举参考地图查找使用。

所需要的是得到枚举常量到JSP的范围,这样就可以再使用的实际枚举本身的关键。要做到这一点,在控制器你做这样的事:

for (MyEnum e : MyEnum.values()) { 
    request.putAttribute(e.toString(), e); 
} 

你在这里做什么是添加变量引入命名为枚举的字符串表示的范围。 (你当然可以避开一些值前面加上e.toSring()命名的问题)

现在,当你做,你将使用实际的枚举常量的关键和以下

${map[ONE]} 

因此会从地图中找回适当的对应值。 (注意周围有没有一报价,那是因为你在这种情况下,引用请求属性之一,即上面添加)

+0

唉!创意解决方案:) – 2014-03-21 17:12:26

+2

非常好,只要你不必使用具有相同名称的常量的枚举。 – 2014-06-10 09:35:04

0
${map[MyEnum.One]} 

这对我的作品。但是,你必须写你的类的完整名称:my.package.MyEnum或导入MyEnum类:

<%@page import="my.package.MyEnum"%> 
+0

它适用于Pivotal tc Server 3.1.1(来自STS)和Tomcat 8.0.28,但它不适用于Tomcat 8.0.14 – 2015-11-19 08:18:37

1

我通常使用此解决方案:

​​

首先,我导入枚举。然后,我将我想要的枚举值保存到JSTL变量中。然后我可以用这个变量作为键访问地图。