如何使用 与在UI DefaultStreamedContent:重复? 如何使用 与在U

2019-05-17 11:02发布

我试图显示面板,让用户可以看到项目类别(显示为图像)的名单和点击它们可以在类别中浏览产品(将显示图像)

为了显示项目类别,我使用的用户界面:重复河畔支撑豆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的部分代码

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:重复”是如何工作的,因为“图像列表”中包含的图片,我可以根据需要在任何方法保存相同。 如果我指定的固定数目(例如:“imageList.get(0)”)在“的getData”方法然后相同的图像是示出多次。 在哪里,如果我把“imageNum”没有“imageList.add(BAOS)”扔错误“错误流动态资源”

我累了比约恩博动的建议,并进行必要的修改,但现在不显示图像

Answer 1:

这是不可能使用<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}管理bean必须只是有:

private List<Long> imageIds; // +getter

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

@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()));
        }
    }

}


Answer 2:

你用错误的用户界面:重复标记。 你有var属性,但你可以在p中不使用此:graphicImage的标签值attribute.Please看样使用,

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


文章来源: How to use with DefaultStreamedContent in an ui:repeat?