我在controller.java中有以下MultiHashMap
MultiHashMap multimap= new MultiHashMap();
List<SampleList> list1 = (List<SampleList>)
request.getPortletSession().getAttribute("list1");
Iterator<SampleList> sampleListIterator= list1.iterator();
while(sampleListIterator.hasNext()){
SampleList sampleList = sampleListIterator.next();
List <SubList> subList = sampleList.getsubList();
Iterator<SubList> subListIterator = subList.iterator();
while(subListIterator.hasNext() ){
SubList subList2 = subListIterator.next();
multimap.put(subList2.getCategorySubcategory(),subList2.getCost());
}
}
在jsp中,我有一个显示上述哈希图的表
<table>
<tbody>
<c:foreach var="item" items="${multimap}">
<tr>
<th> ${item.key}</th>
<c:foreach var="valueList" items=${item.value}>
<td> ${valueList}</td>
</c:foreach>
</tr>
</c:foreach>
</tbody>
</table>
尝试从控制器渲染值时出现错误。
最佳答案
Apache Commons的MultiHashMap已被弃用,应改为使用MultiValueMap。
不推荐使用的。现在,类可作为MultiValueMap在地图子包中使用。此版本将在集合v4.0中删除。
MultiHashMap和MultiValueMap类都具有getCollection(Object key)
方法,该方法将返回该特定键的值的Collection:
java.util.Collection getCollection(java.lang.Object key)
获取映射到指定键的集合。
您可以使用JSTL,OGNL等在JSP中像其他任何Collection一样对其进行迭代。
编辑
令人惊讶的是,整个互联网中甚至没有一个JSTL或OGNL此类用法的示例……我想您的问题将变得很流行,+ 1;)
由于MultiValueMap(以及已弃用的MultiHashMap)是一个Map,其中包含Map的每个键的值的集合,因此应在JSTL中对此进行迭代(未经测试,但大概是正确的)(现在已在Servlet的JSTL 1.1.2上进行了测试。 2.4 / JSP 2.0容器):
<c:forEach var="entry" items="${multiMap}">
<br/>-> Key: <c:out value="${entry.key}"/>
<br/>-> Values for this key:
<c:forEach var="currentValue" items="${entry.value}">
<br/>|---> value: <c:out value="${currentValue}"/>
</c:forEach>
</c:forEach>
像这样填充
multiMap = new MultiValueMap();
multiMap.put("key1", "value1-1");
multiMap.put("key1", "value1-2");
multiMap.put("key1", "value1-3");
multiMap.put("key2", "value2-1");
multiMap.put("key2", "value2-2");
multiMap.put("key2", "value2-3");
multiMap.put("key3", "value3-1");
multiMap.put("key3", "value3-2");
multiMap.put("key3", "value3-3");
输出是这样(从我的JSP复制和粘贴):
-> Key: key1
-> Values for this key:
|---> value: value1-1
|---> value: value1-2
|---> value: value1-3
-> Key: key3
-> Values for this key:
|---> value: value3-1
|---> value: value3-2
|---> value: value3-3
-> Key: key2
-> Values for this key:
|---> value: value2-1
|---> value: value2-2
|---> value: value2-3
然后它可以完美工作(除了奇怪的事实,即key3在key2之前出现);如果仍然有问题,则它们与代码无关,而是在您的配置中。
请在此处查询BalusC的JSTL tag wiki on SO,this nice article或对JSTL问题的众多解答。
不过,最后,看看用于创建MultiValueMap的代码,强烈建议您开始构建一些自定义对象,如面向对象编程所建议的那样,以避免过多的嵌套列表和地图,否则可能导致无法阅读,无法维护的代码。