キー/値の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>
で置き換えると、すべてが正常に機能し、リストが期待どおりに印刷されます。そのような動作が発生する理由は何ですか?
UPDATE:JSF 2.3(2017以降)はこれをサポートします 箱から出して 。
残念ながら、UIData
およびUIRepeat
は、JSFでのマップの反復処理をサポートしていません。
これが気になる場合(私はそうだと思います)、次の問題に投票し、可能であれば、これについてのあなたの気持ちを説明するコメントを残してください:
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;
}
次に、次のように*-taglib.xml
ファイルでEL関数を定義します。
<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>
<a4j:repeat value="#{myBean.myMap.entrySet().toArray()}" var="_entry">
<h:outputText value="#{_entry.key}"/><br/>
<h:outputText value="#{_entry.value}"/>
</a4j:repeat>
<ui:repeat>
とも使用
JSF 1.2で私のために働くようです、それが誰かを助けることを願っています...
<h:panelGroup>
<ul>
<ui:repeat value="#{myBean.myMap.keySet().toArray()}" var="key">
<li>key:#{key}</li>
<li>value:#{myBean.myMap[key]}</li>
</ui:repeat>
</ul>
</h:panelGroup>
el 2.2のサポートにより、以下のようにマップを反復できます。
<ui:repeat value="#{myBean.stats.keySet().toArray()}" var="x">
<h:outputText value="#{myBean.stats.get(x)}" /><br />
</ui:repeat>