我在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中我有一个显示上述hashmap的表
<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>
当我尝试从控制器渲染值时出现错误。
答案 0 :(得分:4)
Apache Commons MultiHashMap 已弃用,您应该使用MultiValueMap。
<强>已过时即可。 类现在可以在map子包中作为MultiValueMap使用。此版本将在集合v4.0中删除。
MultiHashMap和MultiValueMap类都有一个getCollection(Object key)
方法,它将为特定的键返回值的集合:
java.util.Collection getCollection(java.lang.Object key)
获取映射到指定键的集合。
您可以使用JSTL,OGNL等在JSP中将其作为任何其他集合进行迭代...
修改强>
Surprinsingly,在整个互联网中,甚至没有一个这个类用法的例子在JSTL和OGNL ......我猜你的问题会变得流行,+ 1;)
由于MultiValueMap(以及不推荐使用的MultiHashMap)是Map的每个键的值集合的Map,它应该在JSTL中迭代,就像这样(未经测试,但可能是正确的)(现在在 Servlet 2.4 / JSP 2.0 容器中的 JSTL 1.1.2 上进行测试) :
<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之前出现的奇怪事实);如果你仍有问题,它们与代码无关,但在你的配置中。
请在此处查看JSTL tag wiki on SO,this nice article或来自BalusC的JSTL问题的众多答案。
作为最后一个,看看你正在使用创建 MultiValueMap的代码,我强烈建议你开始构建一些自定义对象,作为对象面向对象编程建议,以避免过多嵌套列表和地图,这可能导致无法读取的代码无法维护。
答案 1 :(得分:1)
之前我没有使用过MultiHashMaps,但这是我通常在jsp页面中显示HashMap内容的方式(没有泛型示例):
Iterator iter = map.entrySet().iterator();
while(iter.hasNext()){
Map.Entry entry = iter.next();
Object key = entry.getKey();
Object value = entry.getValue();
答案 2 :(得分:0)
使用JSTL Core taglibrary: &LT;%
Map<String, String> countryList = new HashMap<String, String>();
countryList.put("United States", "Washington DC");
countryList.put("India", "Delhi");
countryList.put("Germany", "Berlin");
countryList.put("France", "Paris");
countryList.put("Italy", "Rome");
request.setAttribute("capitalList", countryList);
%>
<c:forEach var="country" items="${capitalList}">
Country: ${country.key} - Capital: ${country.value}
</c:forEach>
如果您正在使用struts,那么您可以使用struts逻辑标记库来迭代并在JSP中显示地图:
<logic:iterate name="students" id="nameObj" scope="session">
<bean:write name="nameObj" property="key"/>
<bean:write name="nameObj" property="value"/>
</logic:iterate>