JSTL извлекает хэш-карту из сеанса

У меня есть хэш-карта, которая хранится в сеансе. hashMap — это карта карт.

HashMapStoredInSession ={"290" = {text="abc", response="someText"}, "276"={text="xyz", response="random"}};  

Я не хочу использовать скриптлеты. Но я застрял с одним скриптлетом и не могу заставить его работать. Любые предложения, где я ошибаюсь, были бы замечательными. Следующая комбинация SCRIPTLET + JSTL работает

Скриптлет:

<%     
    Map hMap= (Map)request.getSession().getAttribute("HashMapStoredInSession");   
    pageContext.setAttribute("mapofMaps", hMap);  
%>  

Код JSTL:

<c:if test="${param.ID != 'null' && not empty param.ID}">   
    <c:set var="someID" value="${param.ID}" scope="session"/>  
</c:if>  
<c:forEach items="${mapofMaps}" var="outerMap">             
    <c:if test="${outerMap.key == someID}">    // this is the line where exception is thrown when the above scriptlet code is replaced with JSTL below                  
        <c:forEach items="${outerMap.value}" var="innerMap">                    
            <c:if test="${innerMap.key == 'param1'}">  
                <c:set var="response1" value="${innerMap.value}"/>  
            </c:if>  
            <c:if test="${innerMap.key == 'param2'}">  
                <c:set var="response2" value="${innerMap.value}"/>  
            </c:if>              
        </c:forEach>  
    </c:if>  
</c:forEach>  

Теперь, если я попытаюсь заменить код скриптлета следующим (без изменений в коде JSTL)

<c:set var="mapofMaps" value ='<c:out value ="<%=request.getSession().getAttribute("HashMapStoredInSession")%>"/>'/>  

Я получаю следующую ошибку

An error occurred while evaluating custom action attribute "test" with value "${outerMap.key == someID}":   
Unable to find a value for "key" in object of class "java.lang.String" using operator "." (null) 

person SJ11    schedule 30.11.2011    source источник


Ответы (1)


Вы можете просто сослаться на него с помощью ${HashMapStoredInSession}.

<c:forEach items="${HashMapStoredInSession}" var="outerMap">             

Или, если вы действительно хотите переименовать имя атрибута, сделайте так:

<c:set var="mapofMaps" value="${HashMapStoredInSession}" />  

Суть в том, что EL ${} уже ищет атрибуты в области страницы, запроса, сеанса и приложения. Таким образом, вам не нужно явно использовать session.getAttribute() в скриптлете.

Смотрите также:

person BalusC    schedule 30.11.2011