我想通过在JSTL中的循环中通过键访问HashMap<Integer, ArrayList<Integer>>
,但是我尝试的方法不起作用。
我尝试了两种方法,尽管第一种有效,但它违反了使用HashMap的目的。我希望能够通过直接使用键来访问值。
<%
HashMap<Integer, ArrayList<Integer>> LocationLevels =
levelManagementBean.getLocationLevels((Integer)
session.getAttribute("NodeId"), (String)
session.getAttribute("NodeName"));
pageContext.setAttribute("LocationLevels", LocationLevels);
%>
<c:forEach items="${LocationLevels}" var="elem">
<c:if test="${elem.key == 9}">
<c:forEach items="${elem.value}" var="levs">
<c:out value="${levs}"/>
</c:forEach>
</c:if>
</c:forEach>
<br>
<c:set var="temp" value="9"/>
<c:forEach var="elem" items="${LocationLevels[temp]}">
<c:out value="${elem}"/>
</c:forEach>
LocationLevels是从Bean函数返回的HashMap。代码的前两行在scriptlet标记中(我知道这不是最佳实践,但是由于某些限制,我试图在将JSP页面的所有其他部分转换为JSTL时使HashMap保持相同)。函数getLocationLevels返回所需格式的HashMap,这是有保证的(因为我之前在scriptlet中有一个Java代码,可以正常工作)。
假设我想访问存储在与键9对应的HashMap中的ArrayList。第一个<c:forEach>
循环有效,但是第二个无效,并且我不知道为什么。
感谢您的帮助。
答案 0 :(得分:0)
在您的特定情况下,$ {entry.value}实际上是一个列表,因此您也需要对其进行迭代:
<c:forEach var="entry" items="${LocationLevels}">
<c:if test="${entry.key == '9'}">
<c:out value="${entry.value}"/>
<c:set var="tempList" value="${entry.value}"/>
</c:if>
</c:forEach>
<c:forEach var="elem" items='${tempList}'>
<c:out value="${elem}"/>
</c:forEach>