在JSTL中访问Map <Enum,Object>

Pat*_*ick 11 java enums jsp jstl

我有:

public enum MyEnum{
    One, Two, Three
}
Run Code Online (Sandbox Code Playgroud)

从控制器,我输入模型:

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

我如何在我的JSTL中以一种巧妙的方式访问地图中的关键枚举MyEnum.One对象?

${map['One']} //does not seem to work...
Run Code Online (Sandbox Code Playgroud)

也没有

${map[MyEnum.One]}
Run Code Online (Sandbox Code Playgroud)

bin*_*kdm 15

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

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

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

for (MyEnum e : MyEnum.values()) {
  request.putAttribute(e.toString(), e);
}
Run Code Online (Sandbox Code Playgroud)

你在这里做的是在变量中添加变量,命名为枚举的字符串表示.(你当然可以通过在e.toSring()前加上一些值来避免命名问题)

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

${map[ONE]}
Run Code Online (Sandbox Code Playgroud)

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

  • 只要您不必使用具有相同名称的常量的枚举,那就太好了. (2认同)

Chs*_*y76 11

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

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

那么你的第一种方法就是:

${map['One']} // works now
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想/不想更改地图,您可以编写自定义EL功能来为您执行上述操作.