使用JSF 1.2和JSP …. 是否可以迭代其值包含集合的Map? 我有一个看起来像这样的地图: Map String,List Foo MYMAP; 我想迭代myMap并为每个键绘制一个单独的表. 每个表都会包含多行. 每行将表示
是否可以迭代其值包含集合的Map?
我有一个看起来像这样的地图:
Map< String,List< Foo>> MYMAP;
我想迭代myMap并为每个键绘制一个单独的表.
每个表都会包含多行.
每行将表示映射到当前键的ArrayList中的Foo对象.
遗憾的是,我们正在使用JSF 1.2和JSP.
我希望我可以使用嵌套的< h:dataTable>标签,但我没有任何成功.
编辑:
在咨询BalusC的答案之后,这是我当前的JSP代码:
<c:forEach items="#{someModule$someBean.prefMap}" var="mapEntry"> <br/><br/><p>Key: <h:outputText value="#{mapEntry.key}"/></p> <h:dataTable value="#{mapEntry.value}" var="pref"> <h:column><h:outputText value="#{pref.defaultFieldLabel}"/></h:column> <h:column><h:outputText value="#{pref.fieldLabel}"/></h:column> </h:dataTable> </c:forEach>
它会导致以下异常:
javax.servlet.jsp.JspTagException:不知道如何迭代< forEach>中提供的“items”
这是我的Managed Bean中的一些代码.
请注意,我使用HashMap和ArrayList而不是Map和List
(我读到某处你无法使用接口,这也不起作用)
private HashMap<String, ArrayList<Foo>> prefMap; public HashMap<String, ArrayList<Foo>> getPrefMap() { if (prefMap == null) { buildPrefMap(); } return prefMap; } private void buildPrefMap() { prefMap = new HashMap<String, ArrayList<Foo>>(); for (Foo mdp : getFooArray()) { String cat = mdp.getField().getCategory(); if (! prefMap.containsKey(cat)) { ArrayList<Foo> mpl = new ArrayList<Foo>(); mpl.add(mdp); prefMap.put(cat, mpl); } else { prefMap.get(cat).add(mdp); } } } private void dumpMapInfo() { StringBuilder sb = new StringBuilder(); Map<String, ArrayList<Foo>> theMap = getPrefMap(); for (String key : theMap.keySet()) { sb.append(key + ": " + theMap.get(key).size()); } System.out.println("\n\n" + sb.toString()); }
在呈现页面之前调用dumpMapInfo确认Map不为null并按预期填充.
JSF没有任何可以迭代Map
的组件.只有
JSTL
<c:forEach>
可以遍历Map.每次迭代都会返回一个
Map.Entry
,而后者又有getKey()和getValue()方法.您可以依次使用
<h:dataTable>
迭代地图值.
<c:forEach items="#{bean.map}" var="entry"> <p>Key: <h:outputText value="#{entry.key}" /></p> <h:dataTable value="#{entry.value}" var="foo"> <h:column><h:outputText value="#{foo.prop1}" /></h:column> <h:column><h:outputText value="#{foo.prop2}" /></h:column> <h:column><h:outputText value="#{foo.prop3}" /></h:column> </h:dataTable> </c:forEach>
只有在使用JSTL 1.2时才更新此功能.这在JSTL 1.1中失败,因为在JSTL 1.1标记中无法识别#{},因此您被迫使用${},但这反过来在嵌套的JSF组件中失败,因为它们只接受#{}.您基本上需要在整段代码中回归“普通”JSP / HTML,或者更好的是,抓住Tomahawk的< t:dataList>.