在JSP中使用单个键和多个值渲染多值哈希映射

时间:2013-05-14 13:32:42

标签: java jsp jstl apache-commons

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

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

3 个答案:

答案 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 SOthis 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>