簡體   English   中英

JSF 1.2 - 迭代包含集合的Map

[英]JSF 1.2 - iterate over a Map that contains Collections

使用JSF 1.2JSP ....

是否可以迭代其值包含集合的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()方法。 您可以依次使用<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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM