Erste Antwort (EL 2.1, Mai 2009)
Wie in diesem Java-Forum-Thread erwähnt :
Grundsätzlich fügt Autoboxing ein Integer-Objekt in die Map ein. dh:
map.put(new Integer(0), "myValue")
EL (Expressions Languages) wertet 0 als Long aus und sucht daher nach einem Long als Schlüssel in der Karte. dh es bewertet:
map.get(new Long(0))
Da a Long
niemals einem Integer
Objekt entspricht, findet es den Eintrag in der Karte nicht.
Das war's auf den Punkt gebracht.
Update seit Mai 2009 (EL 2.2)
Im Dezember 2009 wurde EL 2.2 mit JSP 2.2 / Java EE 6 eingeführt , mit einigen Unterschieden zu EL 2.1 .
Es scheint (" EL Expression parsing integer as long "), dass:
Sie können die Methode intValue
für das Long
Objekt self in EL 2.2 aufrufen :
<c:out value="${map[(1).intValue()]}"/>
Das könnte eine gute Abhilfe hier sein (auch in unten genannten Tobias Liefke ‚s Antwort )
Ursprüngliche Antwort:
EL verwendet die folgenden Wrapper:
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-Seite, die dies demonstriert:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page import="java.util.*" %>
<h2> Server Info</h2>
Server info = <%= application.getServerInfo() %> <br>
Servlet engine version = <%= application.getMajorVersion() %>.<%= application.getMinorVersion() %><br>
Java version = <%= System.getProperty("java.vm.version") %><br>
<%
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);
%>
<h3>Looking up map in JSTL - integer vs long </h3>
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.
<table border="1">
<tr><th>Key</th><th>value</th><th>Key Class</th></tr>
<c:forEach var="entry" items="${myMap}" varStatus="status">
<tr>
<td>${entry.key}</td>
<td>${entry.value}</td>
<td>${entry.key.class}</td>
</tr>
</c:forEach>
</table>
<h4> Accessing the map</h4>
Evaluating: ${"${myMap['2']}"} = <c:out value="${myMap['2']}"/><br>
Evaluating: ${"${myMap[2]}"} = <c:out value="${myMap[2]}"/><br>
Evaluating: ${"${myMap[42]}"} = <c:out value="${myMap[42]}"/><br>
<p>
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
<p>
lifeInteger = <%= lifeInteger %><br/>
lifeLong = <%= lifeLong %><br/>
lifeInteger.equals(lifeLong) : <%= lifeInteger.equals(lifeLong) %> <br>
Ein weiterer hilfreicher Hinweis zusätzlich zu dem obigen Kommentar wäre, wenn in einer Variablen wie einem Anforderungsparameter ein Zeichenfolgenwert enthalten ist. In diesem Fall führt die Übergabe auch dazu, dass JSTL den Wert von "1" als Stich eingibt und daher keine Übereinstimmung in einer Map-Hashmap gefunden wird.
Eine Möglichkeit, dies zu umgehen, besteht darin, so etwas zu tun.
Dies wird nun als langes Objekt behandelt und hat dann die Möglichkeit, ein Objekt abzugleichen, wenn es in der Kartenkarte oder was auch immer enthalten ist.
Fahren Sie dann wie gewohnt mit so etwas fort
quelle
Sie können alle Funktionen von Long verwenden, wenn Sie die Nummer in "(" ")" eingeben. Auf diese Weise können Sie das Long in ein Int umwandeln:
quelle
Basierend auf dem obigen Beitrag habe ich dies versucht und dies hat gut funktioniert. Ich wollte den Wert von Karte B als Schlüssel für Karte A verwenden:
quelle
Wenn Sie zufällig eine
Map
mitInteger
Schlüsseln haben, die Sie nicht ändern können, können Sie eine benutzerdefinierte EL-Funktion schreiben , um eineLong
in zu konvertierenInteger
. Dies würde Ihnen erlauben, etwas zu tun wie:quelle