我没有得到 getImages 方法
该getImages
方法是该属性的获取器,该属性images
恰好被设置为.value
<ui:repeat>
那么为什么它是一个 String 对象的列表呢?我认为该graphicImage
组件必须具有一个 StreamedContent 的值?
是的,它的值必须是 StreamedContent,但您不能循环通过 StreamedContents 在页面上构建图像列表。原因是graphicImage
Primefaces 组件在 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>
value
repeat的属性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()));
}