2011-05-14 53 views
9

Tengo bean "MyBean", que tiene la propiedad HashMap - "mapa" cuyo tipo de valores es MyClass. Quiero mostrar algunas propiedades del mapa en jsf usando ui: repeat. Pero estos código:¿Cómo se muestran los valores de hashmap en jsf?

<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 muestra 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?

+0

(@Aram: hay que poner una línea en blanco entre bloques de texto y código normal, de lo contrario no se formatea correctamente) – Mat

+0

@Mat: Ok, gracias. No sabía sobre eso. –

Respuesta

5

Desde el documentation para el atributo repeat valor:

El nombre de una colección de artículos que esta etiqueta itera sobre. La colección puede ser List, matriz, java.sql.ResultSet, o una java individual Object. Si la colección es nula, esta etiqueta no hace nada.

Así, var está establecido como su HashMap y EL intenta buscar la clave "value" en él. Deberá exponer su conjunto de entrada como List.

+0

¿Entonces no hay forma de usar el mapa? –

+0

@Aram Gevorgyan - como 'dataTable',' repeat' es un componente basado en índice (ver los atributos _offset_ y _size_). Adam Winer (que estaba en el grupo de expertos de JSF) analiza un caso similar aquí: [Uso de conjuntos con UIData] (http://sfjsf.blogspot.com/2006/03/usings-sets-with-uidata.html). – McDowell

25

De hecho, es una pita importante. El <c:forEach> admitió Map por mucho tiempo. Además de proporcionar otro getter según lo sugerido por McDowell, también puede solucionar esto mediante un custom EL function.

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

donde el aspecto EL función como esta

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

O, si estás en EL 2.2 ya (proporcionado por Servlet 3.0 contenedores compatibles, como Glassfish 3, Tomcat 7, etc.), luego solo use Map#entrySet() y luego Set#toArray().

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

gracias, pero creo que puedo hacerlo con la lista. –

+0

Hola BalusC, tu sintaxis '# {util: toList (bean.map)}', es 'util' un bean administrado, BalusC? Nunca veo esta sintaxis antes. –

+0

@Thang: es una función EL: http://stackoverflow.com/questions/7079978/how-to-create-a-custom-el-function/7080174#7080174 Es como funciones de JSTL. [OmniFaces] (http://wiki.omnifaces.googlecode.com/hg/vdldoc/index.html) también tiene algunos en el espacio de nombres 'of', vea' of: mapToList() '. – BalusC

Cuestiones relacionadas