Java 如何在ui:repeat/h:dataTable/p:dataTable中使用p:graphicImage和StreamedContent?

Java 如何在ui:repeat/h:dataTable/p:dataTable中使用p:graphicImage和StreamedContent?,java,jsf,primefaces,imagelist,Java,Jsf,Primefaces,Imagelist,我有一个带有StreamedContent属性的对象列表,我需要在组件中显示它 但这并没有显示出来。它将显示alt文本。我看到了另一篇帖子,但我不理解getImages()方法 我不明白getImages方法 getImages方法是images属性的getter,该属性恰好被设置为的值 那么为什么它是一个字符串对象列表呢?我认为graphicImage组件的值必须是StreamedContent 是,其值必须是StreamedContent,但不能通过循环StreamedContent在

我有一个带有
StreamedContent
属性的对象列表,我需要在
组件中显示它



但这并没有显示出来。它将显示alt文本。我看到了另一篇帖子,但我不理解
getImages()
方法

我不明白getImages方法

getImages
方法是
images
属性的getter,该属性恰好被设置为

那么为什么它是一个字符串对象列表呢?我认为
graphicImage
组件的值必须是StreamedContent

是,其值必须是StreamedContent,但不能通过循环StreamedContent在页面上生成图像列表。原因是
graphicsimage
Primefaces组件在HTML页面上呈现为标准的HTML
标记。如果查看Firebug、Fiddler或其他工具的控制台输出,您将注意到对JSF页面的请求,然后还会注意到对页面引用的每个图像资源的单独请求。这些图像资源必须从一系列单独的请求中逐个加载,那么ManagedBean如何知道哪个请求映射到哪个图像

这就是为什么repeat组件必须遍历唯一图像id列表的原因,因为它在构建graphicImage组件时,本质上是在构建一个HTML图像标记,该标记引用了由id标识的特定图像的Web服务器。要发送此唯一id,他们使用的是
facelets标记,该标记添加了唯一的HTTP请求参数

<ui:repeat value="#{bean.images}" var="imageID">
   <p:graphicImage value="#{bean.image}">
      <f:param name="imageID" value="#{imageID}" />
   </p:graphicImage>
</ui:repeat>
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()));
} 

如果您试图在复合组件中使用graphicImage也是一个问题…

+1因为我浪费了10分钟,并发布了一个非常类似的答案:)唯一的区别是我还提到了
getImage()
在视图范围的bean上不起作用。这个bean必须是真正的请求/会话/应用程序范围。完全独立的应用程序作用域bean是最好的。@BalusC很高兴浪费您的时间:)我不知道
getImage
在ViewScope bean中不起作用,为什么?另外,我在项目中总是使用一个单独的RequestScoped bean,但是为什么应用程序在这种情况下处理得更好呢?视图范围的bean是特定于视图的。资源请求没有视图的概念。将在每个请求上重新创建请求范围的bean。但是bean实例实际上并不持有任何请求范围的状态,对吗?所有的工作都在getter中完成。@BalusC Brilliant!谢谢,这很有道理。我现在要重构一些东西;-)