Respuesta inicial (EL 2.1, mayo de 2009)
Como se menciona en este hilo del foro de Java :
Básicamente, el autoboxing coloca un objeto Integer en el mapa. es decir:
map.put(new Integer(0), "myValue")
EL (Expressions Languages) evalúa 0 como Long y, por lo tanto, busca un Long como clave en el mapa. es decir, evalúa:
map.get(new Long(0))
Como a Long
nunca es igual a un Integer
objeto, no encuentra la entrada en el mapa.
Eso es todo en pocas palabras.
Actualización desde mayo de 2009 (EL 2.2)
En diciembre de 2009 se introdujo EL 2.2 con JSP 2.2 / Java EE 6 , con algunas diferencias en comparación con EL 2.1 .
Parece (" EL Expression parsing integer as long ") que:
puede llamar al método intValue
en el Long
objeto self dentro de EL 2.2 :
<c:out value="${map[(1).intValue()]}"/>
Esa podría ser una buena solución aquí (también se menciona a continuación en la respuesta de Tobias Liefke )
Respuesta original:
EL utiliza las siguientes envolturas:
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
Página JSP que demuestra esto:
<%@ 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>