Я думал, что это сработает, но это не так (где map уже есть в атрибутах запроса):
<c:out value="${map[1]}"/>
Продолжение: я отследил проблему. По-видимому, ${name[1]} выполняет поиск по карте с числом в виде Long. Я понял это, когда изменил HashMap на TreeMap и получил ошибку:
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
затем ${name[1]} возвращает "Единицу". Что с этим? Почему <c:out> рассматривает число как длинное. Мне кажется нелогичным (поскольку int чаще используется, чем long).
Итак, мой новый вопрос: существует ли обозначение EL для доступа к карте по Integer значению?
pageContext.setAttribute("myMap", map); IntegerlifeInteger=newInteger(42); LonglifeLong=newLong(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.
<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>
Еще один полезный совет в дополнение к приведенному выше комментарию может быть, когда у вас есть строковое значение, содержащееся в некоторой переменной, такой как параметр запроса. В этом случае передача этого параметра также приведет к тому, что JSTL введет значение, скажем, "1", как sting, и, как таковое, совпадение не будет найдено в Map hashmap.
Один из способов обойти это - сделать что-то вроде этого.
Теперь это будет обрабатываться как длинный объект, а затем у него будет шанс сопоставить объект, когда он содержится внутри map Map или чего-то еще.
Затем продолжайте, как обычно, с чем-то вроде
${map[longKey]}
Ответ 3
Вы можете использовать все функции из Long, если вы введете число в "(" ")". Таким образом, вы можете преобразовать long в int:
<c:out value="${map[(1).intValue()]}"/>
Ответ 4
Основываясь на приведенном выше сообщении, я попробовал это, и это сработало нормально, я хотел использовать значение Map B в качестве ключей для Map A: