1

我有一个具有StreamedContent属性的对象列表,我需要在<p:graphicImage>组件中显示它。

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

但这没有显示。它改为显示替代文本。我在 ui:repeat 或 p:dataTable 中看到了其他帖子Use of p:graphicImage,但我不明白该getImages()方法。

4

2 回答 2

3

我没有得到 getImages 方法

getImages方法是该属性的获取器,该属性images恰好被设置为.value<ui:repeat>

那么为什么它是一个 String 对象的列表呢?我认为该graphicImage组件必须具有一个 StreamedContent 的值?

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

这就是为什么重复组件必须遍历唯一图像 id 列表的原因,因为本质上,当它构建一个图形图像组件时,它正在构建一个 HTML 图像标签,其中包含对特定图像的网络服务器的引用,由 id 标识。为了发送这个唯一的 id,他们使用了<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>

valuerepeat的属性graphicImage是一个托管的 bean 属性获取器,它与每个其他graphicImage组件获取的加载图像的方法相同。不同之处在于,在image属性 getter 方法中,我们可以使用FacesContext来获取作为 HTTP 请求参数传递的唯一 imageID。

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()));
} 
于 2012-02-17T12:20:34.813 回答
0

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

于 2013-01-16T00:01:37.620 回答