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">