我在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 SOthis nice article或对JSTL问题的众多解答。

不过,最后,看看用于创建MultiValueMap的代码,强烈建议您开始构建一些自定义对象,如面向对象编程所建议的那样,以避免过多的嵌套列表和地图,否则可能导致无法阅读,无法维护的代码。

08-18 20:33
查看更多