我有一个以整数为键的地图。使用EL,如何通过其键访问值?
Map<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "One"); map.put(2, "Two"); map.put(3, "Three");
我以为这可以工作,但是不行(请求的属性中已经有map了):
<c:out value="${map[1]}"/>
跟进:我找到了问题所在。显然${name[1]}使用数字作为进行地图查找Long。当我更改HashMap为TreeMap并收到错误时,我发现了这一点:
${name[1]}
HashMap
TreeMap
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
如果我将地图更改为:
Map<Long, String> map = new HashMap<Long, String>(); map.put(1L, "One");
然后${name[1]}返回“一个”。那是什么 为什么<c:out>将数字视为长号。对我来说似乎违反直觉(因为int比long更常用)。
<c:out>
所以我的新问题是,是否有一个EL表示法可通过Integer值访问映射?
如本Java论坛主题所述:
基本上,自动装箱会将Integer对象放入Map中。即:
map.put(new Integer(0), "myValue")
EL(表达式语言)将0评估为Long,因此在地图中寻找Long作为键。即它评估:
map.get(new Long(0))
由于a Long永远不等于Integer对象,因此不会在地图中找到该条目。 简而言之就是这样。
Long
Integer
EL 2.2与JSP 2.2 / Java EE 6一起推出,与EL 2.1相比有一些区别。 似乎(“ EL表达式将整数解析为长 ”)是:
你可以在EL 2.2内部intValue的Long对象self 上调用该方法:
<c:out value="${map[(1).intValue()]}"/>