jsf - ui: repetir no funciona con Map
jsf-2 icefaces (4)
Desafortunadamente, UIData
y UIRepeat
no tienen soporte para iterar sobre un mapa en JSF.
Si esto te molesta (supongo que sí), vota por el siguiente problema y, si es posible, deja un comentario que explique cómo te sientes al respecto:
http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-479
Mientras tanto, puedes iterar sobre un mapa con un pequeño código auxiliar:
/**
* 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;
}
Luego defina una función EL en un archivo *-taglib.xml
como este:
<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>
Y finalmente utilízalo en un Facelet como este:
<html xmlns:util="http://example.com/util">
<ui:repeat value="#{util:mapToList(someDate)}" var="entry" >
Key = #{entry.key} Value = #{entry.value} <br/>
</ui:repeat>
Tengo un Map
de clave / valores, que inicializo en @PostConstruct
siguiente manera:
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;
}
Cuando trato de iterar sobre este mapa con <ui:repeat>
como se muestra abajo, y establezco un punto de ruptura en el getter para el mapa, noto que no se está llamando, y por lo tanto, no se imprime nada:
<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>
Pero al reemplazar el código anterior con <c:foreach>
, todo funciona bien, y la lista se imprime como se esperaba, ¿alguna idea de por qué estoy obteniendo ese tipo de comportamiento?
Parece que funciona para mí en JSF 1.2, espero que ayude a alguien ...
<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>
con la compatibilidad con el 2.2 puede iterar mapas como a continuación.
<ui:repeat value="#{myBean.stats.keySet().toArray()}" var="x">
<h:outputText value="#{myBean.stats.get(x)}" /><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>
también se usa con <ui:repeat>