2011-11-17 14 views
11

He visto un par de ejemplos más sobre SO hablando de algunas soluciones extrañas, pero ninguna parece funcionar y todas fueron tratadas en versiones anteriores a JSF 2. Por lo tanto, es posible generar simplemente el teclas de un mapa? He intentado ui: repetir y c: forEach, como a continuación sin suerte:Generar una colección de mapas en facelets JSF 2

<c:forEach items="${myBean.myMap.keySet}" var="var"> 
    <h:outputText value="#{var}"/> 
</c:forEach> 
+0

lo he descubierto. Publicaré en 8 horas cuando SO me lo permita. – Adam

Respuesta

14

Desde su código:

<c:forEach items="${myBean.myMap.keySet}" var="var"> 

Esto no va a funcionar. Esto requiere un método getKeySet() en the Map interface, pero no hay ninguno.

Si su entorno acepta EL 2,2 (Servlet 3.0 contenedores como Tomcat 7, Glassfish 3, etc), entonces usted debe invocar el keySet() método directamente en lugar de llamarlo como una propiedad:

<c:forEach items="#{myBean.myMap.keySet()}" var="key"> 
    <h:outputText value="#{key}"/> 
</c:forEach> 

O si su entorno no admite eL 2.2, sin embargo, entonces usted debe iterar sobre el propio mapa directamente lo que da un Map.Entry instance en cada iteración que a su vez tiene un getKey() method, por lo que este debe hacer así:

<c:forEach items="#{myBean.myMap}" var="entry"> 
    <h:outputText value="#{entry.key}"/> 
</c:forEach> 

Ninguno de los anteriores funciona con <ui:repeat> ya que no es compatible con Map ni Set. Es compatible con List y solo matriz. La diferencia entre <c:forEach> y <ui:repeat> es que el <c:forEach> genera varios componentes JSF durante el tiempo de compilación de la vista y que el <ui:repeat> crea un solo componente JSF que genera su salida HTML varias veces durante el tiempo de visualización de la vista.

+0

Me gusta más tu respuesta. Mas detalle. ¡Te recuerdo! Eres un adicto a la respuesta. ¡Eres un hombre rockero! – Adam

+1

De nada. – BalusC

9

Resulta que la sintaxis correcta de teclas mapa de salida es:

<ui:repeat value="#{myBean.myMap().keySet().toArray()}" var="var"> 
    <h:outputText value="#{var}"/><br/> 
</ui:repeat> 
Cuestiones relacionadas