JSF 1.2-遍历包含Collections的Map

使用JSF 和 ....

是否可以迭代其值包含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并按预期填充。

回答:

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-遍历包含Collections的Map 的全部内容, 来源链接: utcz.com/qa/407433.html

回到顶部