Доступ к содержимому Map ‹Long, Map‹ String, Object ›› в jsp с использованием значения ключа

У меня есть страница jsp, которая получает объект HashMap этого типа: Map<Long, Map<String, Object>>.

Пример этой карты:
foo = {1 = {id=1, response="someText"}, 2={id=99, response="random"}};

Я пытаюсь перебрать содержимое обеих карт в foo следующим образом:

<c:forEach items="${fooMap.content}" var="outerMap">
    <c:forEach items="${outerMap.value}" var = "innerMap">
        <p>${innerMap.response}</p>
    </c:foreach>
</c:forEach>

Но это выдает "Свойство 'response' не найдено в типе java.util.HashMap ... Кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно?"

Я знаю, что могу получить доступ к содержимому innerMap с помощью Map.EntrySet. Но я хочу получить доступ к значению с помощью определенных ключей.


person Stealth    schedule 21.09.2011    source источник


Ответы (1)


${outerMap.value} возвращает Map<String, Object>, из которых одна запись имеет "ответ" в качестве ключа. Поэтому вам нужно получить его прямо оттуда, а не повторять его набор записей в ${innerMap}.

<c:forEach items="${fooMap.content}" var="outerMap">
    <p>${outerMap.value.response}</p>
</c:forEach>

Альтернатива (более неуклюжая) - проверка ключа входа ${innerMap}:

<c:forEach items="${fooMap.content}" var="outerMap">
    <c:forEach items="${outerMap.value}" var="innerMap">
        <c:if test="${innerMap.key == 'response'}">
            <p>${innerMap.value}</p>
        </c:if>
    </c:foreach>
</c:forEach>

Можете ли вы теперь все еще осмыслить это? :)

person BalusC    schedule 21.09.2011
comment
Большое тебе спасибо. Это просто прибило. Не могли бы вы рассказать мне, почему мой подход был неправильным? Я понял, так как foo - это карта карт. Я бы повторил дважды и получил доступ к ключам и значениям. - person Stealth; 22.09.2011
comment
${outerMap} - это Map.Entry, значение которого - внутренняя карта. Чтобы получить значение по ключу, вам нужен дескриптор внутренней карты. Но вы попытались получить значение по ключу на Map.Entry внутренней карты, которая действительно не имеет getResponse() метода. В нем есть только getKey() и getValue() методы. - person BalusC; 22.09.2011
comment
Спасибо за объяснение и ответ. Я приму ваш ответ, как только СО позволит мне это сделать. - person Stealth; 22.09.2011