Я не получаю метод getImages
Метод getImages
- это метод получения свойства images
, который устанавливается как атрибут value
атрибута<ui:repeat>
.
Так почему же это список объектов String?Я думал, что компонент graphicImage
должен иметь значение, которое является StreamedContent?
Да, его значение должно быть StreamedContent, но вы не можете перебрать StreamedContents для создания списка изображений на странице.Причина в том, что компонент graphicImage
Primefaces визуализирует на странице HTML стандартный тег HTML <img>
.Если вы посмотрите на вывод консоли для Firebug, Fiddler или какого-либо другого инструмента, вы заметите запрос на страницу JSF, а затем заметите отдельный запрос для каждого ресурса изображения, на который ссылается страница.Эти ресурсы изображения должны быть загружены один за другим из серии отдельных запросов, так как же ManagedBean должен знать, какой запрос соответствует какому изображению?
Вот почему компонент повторения должен выполнять итерацию по спискууникальные идентификаторы изображений, потому что по сути, когда он создает компонент graphicImage, он создает тег изображения HTML со ссылкой на веб-сервер для конкретного изображения, идентифицируемого идентификатором.Для отправки этого уникального идентификатора они используют тег <f:param>
facelets, который добавляет уникальный идентификатор, идентифицированный как параметр запроса HTTP.
<ui:repeat value="#{bean.images}" var="imageID">
<p:graphicImage value="#{bean.image}">
<f:param name="imageID" value="#{imageID}" />
</p:graphicImage>
</ui:repeat>
Атрибут value
повторяющегося graphicImage
является управляемым компонентомgetter, и это тот же метод загрузки изображения, который получает каждый другой компонент graphicImage
.Разница в том, что в методе получения свойства image
мы можем использовать FacesContext
для получения нашего уникального imageID, который был передан в качестве параметра HTTP-запроса.
public StreamedContent getImage() {
FacesContext context = FacesContext.getCurrentInstance();
HttpServletRequest myRequest = (HttpServletRequest) context.getExternalContext().getRequest();
String imageID = (String) myRequest.getParameter("imageID");
return new DefaultStreamedContent(new ByteArrayInputStream(themeFacade.find(Long.parseLong(imageID)).getImage()));
}