如何在ui中使用<p:graphicimage>和DefaultStreamedContent:repeat?</p:graphicimage>

时间:2012-06-08 07:26:44

标签: jsf primefaces uirepeat graphicimage

我试图显示一个面板,用户可以在其中查看项目列表类别(显示为图像),点击后可以查看该类别中的产品(图像将显示)

为了显示项目类别,我使用了ui:重复nad支持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)'的情况下,它会抛出错误'流动态资源错误'

我厌倦了Bjorn Pollex的建议,并进行了必要的修改但现在没有出现图像

2 个答案:

答案 0 :(得分:17)

无法以这种方式使用<p:graphicImage>。您应该迭代一组唯一的图像标识符,而不是StreamedContent的集合。然后,这些唯一的图片标识符将作为<f:param>传递给<p:graphicImage>,而<ui:repeat value="#{data.imageIds}" var="imageId"> <p:graphicImage value="#{imageStreamer.image}"> <f:param name="id" value="#{imageId}" /> </p:graphicImage> </ui:repeat> 将为浏览器生成正确的网址。

#{data}

您的private List<Long> imageIds; // +getter 托管bean必须只有:

#{imageStreamer}

@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())); } } } 应该是一个单独的应用程序范围的托管bean,看起来基本上是这样的:

{{1}}

答案 1 :(得分:0)

您使用了错误的ui:repeat标记。你有var属性,但你不能在p:graphicImage标签值属性中使用它。请参阅示例用法,

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