JSF 1.2 - 迭代包含集合的 Map

2023-11-27

使用 JSF1.2 and JSP....

是否可以迭代其值包含集合的 Map?

我有一个看起来像这样的地图:

Map<String, List<Foo>> myMap;

我想迭代地图并为每个键绘制一个单独的表。

每个表将包含多行。

每行将代表 ArrayList 中映射到当前键的 Foo 对象。

遗憾的是我们正在使用 JSF 1.2 和 JSP。

我希望我可以使用嵌套<h:dataTable>标签,但我没有取得任何成功。


Edit:

这是我参考 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());
}

Calling dumpMapInfo在渲染页面之前确认 Map 不为 null 并且已按预期填充。


JSF 没有任何可以迭代的组件Map。只有JSTL <c:forEach>可以迭代Map。每次迭代都会给你一个Map.Entry后面又依次有getKey() and 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>

Update仅当您使用 JSTL 1.2 时这才有效。这在 JSTL 1.1 中失败了,因为#{}JSTL 1.1 标签无法识别,因此您被迫使用${},但这在嵌套的 JSF 组件中又会失败,因为它们接受#{}仅有的。您基本上需要在整段代码中回退到“普通”JSP/HTML,或者更好的是,使用 Tomahawk 的<t:dataList>.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSF 1.2 - 迭代包含集合的 Map 的相关文章

随机推荐