SORU
29 Mayıs 2009, Cuma


EL access Tamsayı anahtar tarafından bir harita değer

Tamsayı tarafından bir Harita çizdi. EL kullanarak, nasıl kendi anahtarı tarafından bir değer erişebilir miyim?

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

Bunun işe yarayacağını düşünmüştüm ama harita zaten istek öznitelikleri ettiği yok:

<c:out value="${map[1]}"/>

Takip:Sorun buldum. Görünüşe göre ${name[1]} mu Long Bir sayı ile bir harita arama. TreeMap 13 *değişti zaman ben bu işi çözdüm ve alınan hata:

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

Eğer değiştirirsem benim için Göster:

Map<Long, String> map = new HashMap<Long, String>();
map.put(1L, "One");

sonra ${name[1]} döner "Bir". O da ne? Neden <c:out> uzun bir sayı davranıyor. Bana gayet int uzun, daha sık kullanılan olarak mantığa aykırı.

O yüzden yeni bir soru, Integer değerine göre bir harita erişmek için EL bir gösterim var mı?

CEVAP
29 Mayıs 2009, Cuma


İlk cevap (EL 2.1, Mayıs 2009)

this java forum thread: belirtildiği gibi

Temelde autoboxing koyar haritasına içeren bir değişken. yani:

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

EL (İfadeler Dilleri) Uzun 0 olarak değerlendirir ve böylece harita anahtarı olarak Uzun aramaya gider. değerlendirir yani:

map.get(new Long(0))

Long bir daha asla Integer bir nesneye eşit olduğu haritada giriş bulmaz.
Özetle böyle.


Mayıs 2009'dan bu yana (EL 2.2) güncellemesi

Dec 2009 saw the introduction of EL 2.2 with JSP 2.2 / Java EE 6 few differences compared to EL 2.1 ile.
Görünüşe göre ("EL Expression parsing integer as long"):

EL 2.2 içinde Long nesne kendi yöntemi intValue diyebilirsin:

<c:out value="${map[(1).intValue()]}"/>

Bu iyi bir çözüm burada (Tobias Liefke'34 *s*) . aşağıda belirtilen olabilir


Orijinal cevabı:

EL aşağıdaki ambalajı kullanır:

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 sayfasında bu gösteri:

 <%@ 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>

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Blunty

    Blunty

    13 Mart 2006
  • Evan Coury

    Evan Coury

    29 NİSAN 2007
  • superemposed

    superemposed

    25 Aralık 2007