当前位置:  开发笔记 > 编程语言 > 正文

EL通过Integer键访问映射值

如何解决《EL通过Integer键访问映射值》经验,为你挑选了3个好方法。

我有一个由Integer键入的Map.使用EL,我如何通过其键访问值?

Map map = new HashMap();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");

我认为这会有效,但它没有(地图已经在请求的属性中):


跟进:我追查了问题.显然${name[1]},使用数字进行地图查找Long.我想通了这一点,当我换HashMapTreeMap和收到的错误:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

如果我将地图更改为:

Map map = new HashMap();
map.put(1L, "One");

然后${name[1]}返回"一".那是什么?为什么将数字视为一个长数.对我来说似乎违反直觉(因为int比长期更常用).

所以我的新问题是,是否有EL符号通过Integer值访问地图?



1> VonC..:

初步答复(EL 2.1,2009年5月)

正如在这个java论坛帖子中提到的:

基本上,autoboxing将Integer对象放入Map中.即:

map.put(new Integer(0), "myValue")

EL(表达式语言)将0评估为Long,因此寻找Long作为映射中的键.即它评估:

map.get(new Long(0))

由于a Long永远不等于Integer对象,因此它不会在地图中找到该条目.
简而言之就是这样.


自2009年5月更新(EL 2.2)

2009年12月,使用JSP 2.2/Java EE 6引入了EL 2.2,与EL 2.1相比有一些差异.
似乎(" EL表达式解析整数很长 "):

你可以在EL 2.2中调用对象self intValue上的方法Long:


这可能是一个很好的解决方法(下面也在Tobias Liefke的回答中提到)


原始答案:

EL使用以下包装器:

Terms                  Description               Type
null                   null value.               -
123                    int value.                java.lang.Long
123.00                 real value.               java.lang.Double
"string" ou 'string'   string.                   java.lang.String
true or false          boolean.                  java.lang.Boolean

JSP页面演示了这个:

 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

 <%@ page import="java.util.*" %>

 

Server Info

Server info = <%= application.getServerInfo() %>
Servlet engine version = <%= application.getMajorVersion() %>.<%= application.getMinorVersion() %>
Java version = <%= System.getProperty("java.vm.version") %>
<% Map map = new LinkedHashMap(); map.put("2", "String(2)"); map.put(new Integer(2), "Integer(2)"); map.put(new Long(2), "Long(2)"); map.put(42, "AutoBoxedNumber"); pageContext.setAttribute("myMap", map); Integer lifeInteger = new Integer(42); Long lifeLong = new Long(42); %>

Looking up map in JSTL - integer vs long

This page demonstrates how JSTL maps interact with different types used for keys in a map. Specifically the issue relates to autoboxing by java using map.put(1, "MyValue") and attempting to display it as ${myMap[1]} The map "myMap" consists of four entries with different keys: A String, an Integer, a Long and an entry put there by AutoBoxing Java 5 feature.
KeyvalueKey Class
${entry.key} ${entry.value} ${entry.key.class}

Accessing the map

Evaluating: ${"${myMap['2']}"} =
Evaluating: ${"${myMap[2]}"} =
Evaluating: ${"${myMap[42]}"} =

As you can see, the EL Expression for the literal number retrieves the value against the java.lang.Long entry in the map. Attempting to access the entry created by autoboxing fails because a Long is never equal to an Integer

lifeInteger = <%= lifeInteger %>
lifeLong = <%= lifeLong %>
lifeInteger.equals(lifeLong) : <%= lifeInteger.equals(lifeLong) %>



2> Dave..:

除了上面的注释之外,另一个有用的提示是当某个变量(例如请求参数)中包含字符串值时.在这种情况下,传入此命令也会导致JSTL将say"1"的值键入为sting,因此在Map hashmap中找不到匹配项.

解决这个问题的一种方法是做这样的事情.


这将被视为一个Long对象,然后有机会匹配一个对象,当它包含地图Map或其他任何东西时.

然后像往常一样继续像往常一样

${map[longKey]}



3> Tobias Liefk..:

如果将数字放入"("")",则可以使用Long中的所有函数.这样你可以将long转换为int:


推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有