繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM