Как использовать p: graphicImage с StreamedContent внутри пользовательского интерфейса: repeat / h: dataTable / p: dataTable? - PullRequest
1 голос
/ 17 февраля 2012

У меня есть список объектов со свойством StreamedContent, и мне нужно показать его в компоненте <p:graphicImage>.

<ui:repeat value="#{testuser.answers}" var="imageanswers">
    <p:graphicImage value="#{imageanswers.imageAnswer}" alt="Image" width="200" height="100" />
    <br />
</ui:repeat>

Но это не показано.Вместо этого отображается альтернативный текст.Я видел этот другой пост Использование p: graphicImage в пользовательском интерфейсе: repeat или p: dataTable , но я не понимаю метод getImages().

Ответы [ 2 ]

3 голосов
/ 17 февраля 2012

Я не получаю метод 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()));
} 
0 голосов
/ 16 января 2013

Это проблема, если вы попытаетесь использовать graphicImage внутри составного компонента ...

...