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>

当我尝试从控制器呈现值时出现错误。

4

3 回答 3

4

Apache Commons MultiHashMap弃用,您应该改用MultiValueMap

已弃用类现在可用作地图子包中的 MultiValueMap。此版本将在 collections v4.0 中删除。

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

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

获取映射到指定键的集合。

您可以使用 JSTL、OGNL 等在 JSP 中像任何其他集合一样对其进行迭代...


编辑

令人惊讶的是,在整个 Internet 中甚至没有一个在 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 的代码,我强烈建议您开始构建一些自定义对象,正如面向对象编程所建议的那样,以避免列表和映射的过度嵌套,这可能导致不可读、不可维护代码。

于 2013-05-14T14:24:33.643 回答
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();
于 2013-05-14T13:40:46.543 回答
0

使用 JSTL Core 标签库:<%

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>
于 2013-05-14T15:05:27.770 回答