使用 JSF 1.2和JSP ....
是否可以遍历其值包含集合的 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: Don't know how to iterate over supplied "items" in <forEach>
这是我的托管 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 并且按预期填充。