24

私は次のようMapに初期化するキー/値を持って@PostConstructいます:

Map<String, String> myMap;

@PostConstruct
public void init() {

  myMap=new LinkedHashMap<String, String>();
  myMap.put("myKey","myValue");

}

public Map<String, String> getMyMap() {
    return myMap;
}

public void setMyMap(Map<String, String> myMap) {
    this.myMap = myMap;
}

以下に示すようにこのマップを反復処理しようとし<ui:repeat>、マップのゲッターにブレークポイントを設定すると、マップが呼び出されていないことに気付き、何も出力されません。

<ice:panelGroup>
    <ui:repeat items="#{myBean.myMap}" var="entry" varStatus="loop">
        <input type="checkbox" name="myCheckBoxes" value="#{entry.value}" />
        <span class="#{fn:contains(entry.value,'g') ? 'bold-style' : ''}">#{entry.key}</span>
    </ui:repeat>
</ice:panelGroup>

しかし、上記のコードをに置き換えると<c:foreach>、すべてが正常に機能し、リストが期待どおりに出力されます。なぜこのような動作が発生するのでしょうか。

4

4 に答える 4

35

更新: JSF 2.3 (2017 年以降) は、これをすぐにサポートします

残念ながら、JSF でのマップの反復処理はサポートされていませんUIDataUIRepeat

これが気になる場合 (私はそうだと思います)、次の問題に投票してください。可能であれば、これについてどのように感じているかを説明するコメントを残してください:

http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-479

それまでの間、いくつかの小さなヘルパー コードを使用して Map を反復処理できます。

/**
 * Converts a Map to a List filled with its entries. This is needed since 
 * very few if any JSF iteration components are able to iterate over a map.
 */
public static <T, S> List<Map.Entry<T, S>> mapToList(Map<T, S> map) {

    if (map == null) {
        return null;
    }

    List<Map.Entry<T, S>> list = new ArrayList<Map.Entry<T, S>>();
    list.addAll(map.entrySet());

    return list;
}

次に、次のように EL 関数を*-taglib.xmlファイルに定義します。

<namespace>http://example.com/util</namespace> 

<function>
    <function-name>mapToList</function-name>
    <function-class>com.example.SomeClass</function-class>
    <function-signature>java.util.List mapToList(java.util.Map)</function-signature>
</function>

最後に、次のように Facelet で使用します。

<html xmlns:util="http://example.com/util">

    <ui:repeat value="#{util:mapToList(someDate)}" var="entry" >
        Key = #{entry.key} Value = #{entry.value} <br/>
    </ui:repeat>
于 2011-12-18T15:54:51.137 に答える
27
<a4j:repeat value="#{myBean.myMap.entrySet().toArray()}" var="_entry">
        <h:outputText value="#{_entry.key}"/><br/>
        <h:outputText value="#{_entry.value}"/>
</a4j:repeat>

と一緒に使用する<ui:repeat>

于 2012-10-02T16:34:05.270 に答える
10

el 2.2のサポートにより、以下のようにマップを繰り返すことができます。

<ui:repeat value="#{myBean.stats.keySet().toArray()}" var="x">
    <h:outputText value="#{myBean.stats.get(x)}" /><br />
</ui:repeat>
于 2012-06-07T14:42:40.860 に答える