2010-10-12 34 views
2

在一個servlet我有:JSTL和HashMap的工作不

HashMap eventsByDayNo = new HashMap(); 
eventsByDayNo.put (new Integer(12), "day 12 info"); 
eventsByDayNo.put (new Integer(11), "day 11 info"); 
eventsByDayNo.put (new Integer(15), "day 15 info"); 
eventsByDayNo.put (new Integer(16), "day 16 info"); 

request.setAttribute("eventsByDayNo", eventsByDayNo); 
request.setAttribute("daysInMonth", new Integer(31)); 

並在JSP我:

<c:forEach var="dn" begin="1" end="${daysInMonth}" step="1" varStatus="status"> 
    Day Number=<c:out value="${dn}" /> Value=<c:out value="${eventsByDayNo[dn]}" /><br> 
</c:forEach> 

以上JSTL工作正常,但如果我嘗試抵消天數<c:out value="${eventsByDayNo[dn+3]}" /> 沒有打印任何散列映射條目。任何答案爲什麼不呢?

以上只是我實際應用的概念證明。

回答

1

我的猜測是,dn+3java.lang.Double,而不是java.lang.Integer(你可能會期望)。在EL

<ul> 
<c:forEach var="dn" begin="1" end="${daysInMonth}" step="1"> 
    <li> 
    <c:set var="dnplus3" value="${dn+3}" /> 
    dn=<c:out value="${dn}" /> 
    dnplus3=<c:out value="${dnplus3}" /> 
    class=<c:out value="${dnplus3.class.name}" /> 
    </li> 
</c:forEach> 
</ul> 
+0

你是對的,我期待整數,但它是一個很長的dn = 1 dnplus3 = 4 class = java.lang.Long。 – jeff 2010-10-12 21:35:34

+0

對於參考,*表達式語言規範版本2.2 *在第1.7.1節中定義了運算符'+',在這種情況下導致'Long'值。 – 2010-10-13 22:01:58

+0

只是認爲這是一個強大的打字反擊的例子,而不是防止錯誤,因爲它應該這樣做,沒有做用戶期望的。 – stivlo 2011-06-10 13:01:51

3

號碼(至少,整數)被隱式視爲Long。所以用Map<Long, String>替換你的Map<Integer, String>,它會工作。