7

JSF1.2とJSPの使用...。

値にコレクションが含まれているマップを反復処理することは可能ですか?

私はこのような地図を持っています:

Map<String, List<Foo>> myMap;

myMapを繰り返し処理し、キーごとに個別のテーブルを描画したいと思います。

各テーブルは複数の行を汚染します。

各行は、現在のキーにマップされたArrayListのFooオブジェクトを表します。

残念ながら、JSF1.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からのコードです。

MapとListの代わりにHashMapとArrayListを使用していることに注意してください

(私はあなたがインターフェースを使うことができなかったところを読みました、そしてそれもまた働きません)

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ページをレンダリングする前に呼び出すと、マップがnullではなく、期待どおりに入力されていることが確認されます。

4

1 に答える 1

17

JSFには、を反復処理できるコンポーネントはありませんMapJSTL のみ<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>

これを更新すると、JSTL1.2を使用している場合にのみ機能します。これは、#{}JSTL 1.1タグで認識されないため、JSTL 1.1では失敗します。したがって、を使用する必要がありますが${}、ネストされたJSFコンポーネントでは、これらが#{}のみ受け入れるため、これは失敗します。基本的には、そのコード全体で「プレーンな」JSP / HTMLにフォールバックするか、Tomahawkのを取得する必要があります<t:dataList>

于 2012-10-02T23:32:23.440 に答える