Itérer sur une Liste<Map<String, String>> dans primefaces datatable?
Je suis en train de parcourir la Liste des éléments de la Carte, c'est à dire une liste de tableaux de HashMaps ou quelque chose de similaire, et je suis en train de le faire dans primefaces datatable. C'est en gros ce que j'essaie de faire:
<body>
<h:form>
<p:dataTable value="#{customerBean.list}" var="map">
<c:forEach items="#{map}" var="entry">
<p:column headerText="#{entry.key}">
#{entry.value}
</p:column>
</c:forEach>
</p:dataTable>
</h:form>
</body>
Dans ce cas, customerBean.list
est un List<Map<String, String>>
et l'entrée est un Map<String, String>
.
Ce que je veux faire, c'est de créer une dynamique quantité de colonnes, en fonction de la quantité d'entrées dans un Map<String, String>
tout en utilisant la carte d'entrée de la clé comme un nom d'en-tête, et la valeur de la sortie. Le c:forEach
chose semble fonctionner très bien lorsque je suis en utilisant une codé en dur Map<String, String>
, mais apparemment il ne peut pas faire une boucle par la var de la p:dataTable
. Je suppose que le programme prend la précaution afin d'éviter de devoir parcourir les Cartes de différentes tailles. Alors, comment puis-je faire ce travail de toute façon? Comment puis-je créer un certain nombre de colonnes en fonction de la quantité d'entrées dans une Carte? Notez que je suis certain à 100% que tous les Map<String, String>
est de taille égale dans mon List<Map<String, String>>
EDIT:
Voici mon haricot source. Le code fonctionne très bien et tout et tout, le problème est juste que la boucle ne veulent pas passer par ma carte:
@ManagedBean
@SessionScoped
public class CustomerBean {
private List<Map<String, String>> list = new ArrayList<Map<String, String>>();
private Mapper mapper = new Mapper();
public CustomerBean() {
list = mapper.all(); //gets data from database
}
public List<Map<String, String>> getList() {
return list;
}
public void setList(List<Map<String, String>> list) {
this.list = list;
}
}
- Merci de poster votre backbean code.
- Connexes: stackoverflow.com/questions/3342984/... et stackoverflow.com/questions/13176842/...
Vous devez vous connecter pour publier un commentaire.
Le problème n'est pas lié à la
Map
utilisation dans ce contexte. Le problème, c'est que vous essayez d'obtenir un#{map}
variable seulement disponible lorsque vue doit être rendue, mais vous êtes en s'appuyant sur sa valeur au moment de vue est en cours de construction. Cette dernière est réalisée sur une plus tôt phase du cycle de vie, de sorte qu'il est fondamentalement pas disponible lorsque vous le demande.Encore, tag handler, ou d'afficher la balise de construction, comme
<c:forEach>
, est la seule façon de remplir la variable nombre de colonnes, comme<p:column>
est évaluée lorsque le composant de l'arbre est en cours de construction.Une autre chose à noter est que le backing bean lié à
<c:forEach>
de la balise de propriété, tels queitems
, doit être quelque chose, mais la vue de l'étendue, comme la portée de la requête, sinon il sera recréé lors de chaque demande qui apportera inattendu/résultats indésirables, comme l'exigeait le haricot n'est pas là quand vous essayez d'accéder à ses propriétés. Il y a une certaine configuration d'autres constellations de la résolution de ce problème, mais ils ne sont pas le sujet de discussion ici.Également intéressant de noter qu'il y a un helper
<p:columns>
composant qui n'est à peu près la même.