Ответ 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> здесь.
См. также:
- JSTL в JSF2 Facelets... имеет смысл? - понять "время сборки" и "просмотреть время визуализации" лучше
- динамически создавать столбцы таблицы в JSF - еще один аналогичный вопрос