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,这是在上面添加的)
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功能来为您执行上述操作.
| 归档时间: |
|
| 查看次数: |
7860 次 |
| 最近记录: |