java jsf hashmap uirepeat

java - ¿Cómo mostrar los valores de hashmap en jsf?



uirepeat (2)

Tengo bean "MyBean", que tiene la propiedad HashMap - "map", cuyo tipo de valores es MyClass. Quiero mostrar algunas propiedades del mapa en jsf usando ui: repeat. Pero estos códigos:

<ui:repeat var="var" value="#{mybean.map}" > <tr> <td> <h:outputText value="#{var.value.property1}"></h:outputText> </td> <td><h:outputText value="#{var.value.property2}"></h:outputText></td> </tr> </ui:repeat>

Pero este código no mostró nada. Aunque cuando trato de mostrar los valores de hashmap en jsp de esta manera, fue exitoso. Donde estoy equivocado? ¿Y cómo arreglar eso?


De la documentación para el atributo de valor de repeat :

El nombre de una colección de elementos sobre los que se repite esta etiqueta. La colección puede ser List , array, java.sql.ResultSet o un Object java individual. Si la colección es nula, esta etiqueta no hace nada.

Entonces, var se establece como su HashMap y EL intenta buscar el "value" clave en él. Deberá exponer su conjunto de entradas como una List .


Eso es de hecho una gran pita. El <c:forEach> Map soportado por mucho tiempo. Además de suministrar otro getter como lo sugiere McDowell, también podría solucionar esto mediante una función EL personalizada .

<ui:repeat value="#{util:toList(bean.map)}" var="entry"> #{entry.key} = #{entry.value} <br/> </ui:repeat>

donde la función EL se ve así

public static List<Map.Entry<?, ?>> toList(Map<?, ?> map) { return = map != null ? new ArrayList<Map.Entry<?,?>>(map.entrySet()) : null; }

O, si ya tiene EL 2.2 (proporcionado por contenedores compatibles con Servlet 3.0 como Glassfish 3, Tomcat 7, etc.), simplemente use Map#entrySet() y luego Set#toArray() .

<ui:repeat value="#{bean.map.entrySet().toArray()}" var="entry"> #{entry.key} = #{entry.value} <br/> </ui:repeat>