Afficher une liste d'images dans un format de tableau dans JSF
c'est probablement une question très simple de JSF, mais je n'arrive pas à trouver la réponse simple.
j'ai une Liste d'images, et je veux les afficher dans un tableau d'images. Chaque image est affichée avec son nom de fichier. J'utilise une étiquette ui:repeat comme montré ci-dessous. Je ne reçois pas 5 colonnes comme demandé, cependant, seulement 1.
<h:panelGrid id="resourcePanel" columns="5" rules="all">
<ui:repeat var="res" value="#{resourceUpload.resources}">
<h:panelGrid columns="1" rules="none">
<h:graphicImage
value="/image/resource?id=#{res.idAsString}"
style="width:100px;" />
<h:outputText value="#{res.name}" />
</h:panelGrid>
</ui:repeat>
</h:panelGrid>
2 réponses
la sortie est entièrement comme prévu et spécifié. Le <ui:repeat> est une étiquette de temps de rendu, pas une étiquette de temps de compilation de vue comme <c:forEach> . Après avoir construit la vue, <h:panelGrid> se termine avec 1 composant enfant (le <ui:repeat> lui-même), pas avec n imbriqué <h:panelGrid> composants comme vous obtiendriez avec <c:forEach> .
<html ... xmlns:c="http://java.sun.com/jsp/jstl/core">
...
<h:panelGrid id="resourcePanel" columns="5" rules="all">
<c:forEach var="res" items="#{resourceUpload.resources}">
<h:panelGrid columns="1" rules="none">
<h:graphicImage
value="/image/resource?id=#{res.idAsString}"
style="width:100px;" />
<h:outputText value="#{res.name}" />
</h:panelGrid>
</c:forEach>
</h:panelGrid>
#{resourceUpload} : il ne peut pas être une vue scoped bean, il doit être demande scoped en raison d'un problème d'œuf de poulet en vue sauver / restaurer l'état; vous auriez besoin de mettre à niveau vers Mojarra 2.1.18)
Votre imbriquée <h:panelGrid> fait par la voie pas de proférer des sens. J'aurais utilisé <h:panelGroup> ici.
voir aussi:
- JSTL in JSF2 Facelets... du sens? - comprendre "afficher le temps de construction" vs "vue rendre le temps" meilleur
- créer dynamiquement des colonnes de tableau dans JSF - une autre question similaire
pourquoi utilisez-vous un autre <h:panelGrid> dans le <ui:repeat> ? Tu peux juste utiliser une div comme ça.
Au lieu de
<h:panelGrid columns="1" rules="none">
utiliser
<div style="display:inline-block;">
Edit:
Je ne pense pas que tu puisses le faire avec
<ui:repeat> . Utilisez <c:forEach> à la place. vous devez d'abord importer l'espace de noms
xmlns:c="http://java.sun.com/jstl/core"
maintenant remplacer le <ui:repeat> par <c:forEach> comme suit.
<c:forEach items="#{accountMastList.resultList}" var="res">