在JSTL中访问地图<enum,object =“”> </enum,>

时间:2009-10-11 23:25:31

标签: java jsp enums 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]}

4 个答案:

答案 0 :(得分:15)

你不能做到这一点并不完全正确,但解决方案并非完全直截了当。问题是EL没有将您传入的字符串作为地图键转换为相应的枚举,因此放置$ {map ['One']}不会在地图查找中使用枚举常量MyEnum.One。

我遇到了同样的问题,并且不想恢复使用String键控映射,因此挑战是在JSTL中如何获取在地图查找中使用的实际枚举引用。

所需要的是将Enum常量放入JSP的范围,以便您可以使用实际的Enum本身作为键。为此,在控制器中执行以下操作:

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

您在此处所做的是将变量添加到作为枚举的字符串表示形式的作用域中。 (你当然可以通过在e.toSring()之前加上一些值来避免命名问题)

现在,当您执行以下操作时

${map[ONE]}

您将使用实际的枚举常量作为键,因此将从地图中获取正确的相应值。 (注意ONE周围没有引号,这是因为你在这种情况下引用了请求属性ONE,这是在上面添加的)

答案 1 :(得分: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功能来为您执行上述操作。

答案 2 :(得分:1)

我通常使用这个解决方案:

<%@page import="my.package.MyEnum"%>
<c:set var="One" value="<%=MyEnum.One %>" />
<c:set var="MyEnum_values" value="${map[One]}" />

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

答案 3 :(得分:0)

${map[MyEnum.One]}

它对我有用。但你必须写出你的类的完整名称:my.package.MyEnum或导入MyEnum类:

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