如何解决JSF 1.2-遍历包含Collections的Map
JSF没有可以迭代的任何组件Map
。只有JSTL<c:forEach>
可以迭代Map
。每次迭代都会为您提供Map.Entry
支持,而该支持又具有getKey()
和getValue()
方法。您可以依次使用a<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.1中失败,因为#{}
在JSTL
1.1标记中无法识别,因此您不得不使用${}
,但是在嵌套的JSF组件中这又失败了,因为它们#{}
仅接受。基本上,您需要在整个代码段中使用“普通”JSP / HTML,或者更好的是使用Tomahawk的<t:dataList>
。
解决方法
使用JSF 1.2 和 JSP ....
是否可以迭代其值包含Collection的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>
这是我的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并按预期填充。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。