texto tabla llenar example etiqueta ejemplo cuadro con jsf datatable hashmap treemap

example - llenar tabla con jsf



Usando java.util.Map en h: dataTable (3)

Necesito mostrar Map utilizando <h:dataTable> . Mi bean de respaldo tiene una propiedad de Map como a continuación:

public class Bean { private Map<Integer,String> map; // +getter @PostConstruct public void init() { map = new TreeMap<Integer,String>(); map.put(1,"Sasi"); map.put(2,"Pushparaju"); map.put(3,"Venkat Raman"); map.put(3,"Prabhakaran"); } }

Luego, en la página JSF, intento vincular esta propiedad Map al atributo de value de <h:dataTable> .

<h:dataTable border="1" value="#{bean.map}" var="map"> <h:column id="column1"> <f:facet name="header"> <h:outputText value="UserId"></h:outputText> </f:facet> <h:outputText value="#{map.getKey}"></h:outputText> </h:column> <h:column id="column2"> <f:facet name="header"> <h:outputText value="Email Id"></h:outputText> </f:facet> <h:outputText value="#{map.getValue}"></h:outputText> </h:column> </h:dataTable>

Está dando un error que getKey y getValue no están presentes. Puedo entender que esta no es la forma correcta de hacerlo. ¿Cómo puedo presentar un Map usando <h:dataTable> ?


En cuanto a la última respuesta de prageeth, puede usar entrySet en lugar de keySet; entonces puedes deshacerte de myBean.map.get. Mira este ejemplo:

<h:dataTable border="1" value="#{myBean.map.entrySet().toArray()}" var="map"> <h:column id="column1"> <f:facet name="header"> <h:outputText value="UserId"></h:outputText> </f:facet> <h:outputText value="#{map.key}"></h:outputText> </h:column> <h:column id="column2"> <f:facet name="header"> <h:outputText value="Email Id"></h:outputText> </f:facet> <h:outputText value="#{map.value}"></h:outputText> </h:column> </h:dataTable>

Esto funciona en myfaces 2.2.3 ya que lo acabo de usar yo mismo.

Anotación: Mejor hubiera comentado la última publicación, pero mi reputación no es lo suficientemente alta, por lo tanto, esta es una respuesta adicional.


Puedes probar esta alternativa también.

<h:dataTable border="1" value="#{myBean.map.keySet().toArray()}" var="myVar"> <h:column id="column1"> <f:facet name="header"> <h:outputText value="UserId"></h:outputText> </f:facet> <h:outputText value="#{myVar}"></h:outputText> </h:column> <h:column id="column2"> <f:facet name="header"> <h:outputText value="Email Id"></h:outputText> </f:facet> <h:outputText value="#{myBean.map.get(myVar)}"></h:outputText> </h:column> </h:dataTable>


Hasta el próximo JSF 2.3, los componentes de UIData tales como <h:dataTable> , <p:dataTable> , etc. y <ui:repeat> no <p:dataTable> iterar sobre un Map . Esto solo se admite en <c:forEach> .

Una forma es convertir las entradas del mapa en una matriz (solo entrySet() no funcionará ya que UIData tampoco admite Set hasta el próximo JSF 2.3).

<h:dataTable value="#{bean.map.entrySet().toArray()}" var="entry"> <h:column>#{entry.key}</h:column> <h:column>#{entry.value}</h:column> </h:dataTable>

Otra forma es ajustar el conjunto de entradas del mapa en una colección sobre la cual la <h:dataTable> puede iterar, como una ArrayList .

public class Bean { private Map<Integer, String> map; private List<Entry<Integer, String>> entries; // +getter (no setter necessary) @PostConstruct public void init() { map = new TreeMap<>(); map.put(1, "Sasi"); map.put(2, "Pushparaju"); map.put(3, "Venkat Raman"); map.put(4, "Prabhakaran"); entries = new ArrayList<>(map.entrySet()); } // ... }

<h:dataTable value="#{bean.entries}" var="entry"> <h:column>#{entry.key}</h:column> <h:column>#{entry.value}</h:column> </h:dataTable>

Sin embargo, más limpio, autodocumentado y reutilizable es usar una List<User> lugar de la clase de User tiene las propiedades necesarias, id y name .

public class Bean { private List<User> users; // +getter (no setter necessary) @PostConstruct public void init() { users = new ArrayList<>(); users.add(new User(1, "Sasi")); users.add(new User(2, "Pushparaju")); users.add(new User(3, "Venkat Raman")); users.add(new User(4, "Prabhakaran")); } // ... }

<h:dataTable value="#{bean.users}" var="user"> <h:column>#{user.id}</h:column> <h:column>#{user.name}</h:column> </h:dataTable>