Отобразить список изображений в формате таблицы в JSF

Это, наверное, очень простой вопрос JSF, но я не могу найти простой ответ.

У меня есть список изображений, и я хочу отобразить их в таблице изображений. Каждое изображение отображается с его именем. Я использую тег ui:repeat, как показано ниже. Я не получаю 5 столбцов по запросу, но только 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>

Ответ 1

Вывод полностью соответствует ожидаемому и указанному. <ui:repeat> - это тег времени рендеринга, а не тег времени построения вида, например <c:forEach>. После создания представления <h:panelGrid> заканчивается 1 дочерним компонентом (сам <ui:repeat>), а не с n вложенными компонентами <h:panelGrid>, как, например, с <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>

(это имеет версии Mojarra старше 2.1.18, однако импликация на #{resourceUpload}: она не может быть охваченной областью видимости bean, она должна быть запрошена в зависимости от проблемы с куриным яйцом в представлении состояния сохранение/восстановление, вам нужно перейти на Mojarra 2.1.18)

Ваш вложенный <h:panelGrid> делает, кстати, без лишнего смысла. Я бы использовал <h:panelGroup> здесь.

См. также:

Ответ 2

Почему вы используете другой <h:panelGrid> внутри <ui:repeat>? Вы можете просто использовать div как это.
Вместо

<h:panelGrid columns="1" rules="none">

использование

<div style="display:inline-block;">

Изменить: <ч/" > Я не думаю, что вы можете сделать это с помощью <ui:repeat>. Вместо этого используйте <c:forEach>.

Сначала вы должны импортировать пространство имен

xmlns:c="http://java.sun.com/jstl/core"

Теперь замените <ui:repeat> на <c:forEach> следующим образом.

<c:forEach items="#{accountMastList.resultList}" var="res">