在JSP中如何使用单个键和多个值呈现多值哈希映射

4

我在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>

当我尝试从控制器渲染值时,出现错误。


5
不了解这个非标准类的API,无法回答。请指向它的Java文档。 - JB Nizet
3个回答

4

Apache Commons MultiHashMap已经弃用,你应该使用MultiValueMap代替。

弃用该类现在作为map子包中的MultiValueMap可用。该版本将在collections v4.0中被删除。

MultiHashMap和MultiValueMap类都有一个getCollection(Object key)方法,该方法将返回特定keyvalues集合:

java.util.Collection  getCollection(java.lang.Object key)

Gets the collection mapped to the specified key.

您可以像处理其他集合一样,使用JSTL、OGNL等工具在JSP中进行迭代。


编辑

令人惊讶的是,整个互联网上JSTL和OGNL中甚至没有一个Class使用示例...我猜你的问题会变得流行,+1 ;)

由于MultiValueMap(以及已弃用的MultiHashMap)是一个Map,其中每个Map的键都有一个集合,因此应该像这样在JSTL中迭代它 (未经测试,但可能正确)现在在JSTL 1.1.2中进行了测试,在Servlet 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之前出现); 如果你仍然有问题,那么它们不是与代码相关的,而是与你的配置有关。
请查看SO上的JSTL标签wiki, 这篇好文章或BalusC在SO上对JSTL问题的众多回答。
作为最后一点,看着你使用的代码来创建MultiValueMap,我强烈建议你开始构建一些自定义对象,因为面向对象编程建议避免过多的列表和映射嵌套,这可能导致代码难以阅读和维护。

我现在面临的问题是使用JSTL迭代这个multihashmap在jsp中的问题。你能否帮我提供一下JSP代码? - user2381832
我添加的 JSP 代码与上面的非常相似。当我尝试时,出现了一个错误。 - user2381832
没关系,你说得对。你的代码几乎和我的一样(我没有注意到这一点,因为我是从头开始写的,而不是从你的代码开始)。所以你已经接近成功了:)如果你已经解决了问题,请随意更新你的描述并说明问题的原因。如果我的答案有所帮助,请接受它。 - Andrea Ligios

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();

哦,对不起,我以为他只是在获取键和值信息方面遇到了麻烦。 - Michael Sanchez

0
使用JSTL核心标签库: <%
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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接