[英]Render multi value hash map with single key and multiple values in JSP
我在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>
当我尝试从控制器渲染值时,我收到错误。
不推荐使用 Apache Commons MultiHashMap ,您应该使用MultiValueMap 。
不推荐 。 类现在可以在map子包中作为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 2.4中的 JSTL 1.1.2上进行了测试
)
/ 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之前出现的奇怪事实); 如果你仍有问题,它们与代码无关,但在你的配置中。
请查看SO上的JSTL标签wiki , 这篇好文章或者来自BalusC的JSTL问题的众多答案。
作为最后一个,看看你用来创建 MultiValueMap的代码,我强烈建议你开始构建一些自定义对象 ,正如面向对象编程所暗示的那样,以避免列表和地图的过度嵌套,这可能导致不可读,不可维护码。
我之前没有使用过MultiHashMaps,但这是我通常在jsp页面中显示我的HashMap内容的方式(没有泛型示例):
Iterator iter = map.entrySet().iterator();
while(iter.hasNext()){
Map.Entry entry = iter.next();
Object key = entry.getKey();
Object value = entry.getValue();
使用JSTL Core taglibrary:<%
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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.