【问题标题】:How to use <p:graphicImage> with DefaultStreamedContent in an ui:repeat?如何在 ui:repeat 中将 <p:graphicImage> 与 DefaultStreamedContent 一起使用?
【发布时间】:2012-06-12 06:24:00
【问题描述】:

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

为了显示项目类别,我使用了 ui:repeat 和支持的 bean 类 下面是我的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>

以及托管 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:repeat”是如何工作的,因为“imageList”包含图像,如果需要,我可以在任何一种方法中保存相同的图像。如果我在 'getData' 方法中指定一个固定数字(例如:'imageList.get(0)'),那么同一个图像会显示多次。好像我在没有 'imageList.add(baos)' 的情况下放置了 'imageNum' 时会抛出错误 '流动态资源中的错误'

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

【问题讨论】:

  • 您没有在&lt;ui:repeat&gt; 中引用循环变量(在您的情况下为img)。你的getImages 应该返回一个List&lt;StreamedContent&gt;,你的&lt;p:graphicImage&gt; 应该有value="#{img}"

标签: jsf primefaces uirepeat graphicimage


【解决方案1】:

不能以这种方式使用&lt;p:graphicImage&gt;。您应该迭代唯一图像标识符的集合,而不是 StreamedContent 的集合。然后必须将这些唯一的图像标识符作为 &lt;f:param&gt; 传递给 &lt;p:graphicImage&gt;,这反过来将为浏览器生成正确的 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()));
        }
    }

}

【讨论】:

  • hankyou BalusC 它有效,但我必须评论@EJB,如果我没有得到“com.sun.faces.mgbean.ManagedBeanCreationException:在托管 bean imageStreamer 上执行资源注入时出错”我还有一个问题> 当我刷新页面时,图像消失了,为什么会这样。再次谢谢你
  • 不客气。好吧,我只是假设您将 EJB 用于业务/数据服务。它提供了一种简单且安全的方式来透明地处理数据库事务。如果您不使用它,那么只需按照您通常的方式获取服务即可。
  • 还有一个问题,如果我需要在图像上获得点击事件,那么我该怎么做。我不能在 ui:repeat 中放置 Ajax。
  • @BalusC 找不到图片怎么返回404错误?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2012-10-09
    • 2012-04-21
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 2013-09-15
    相关资源
    最近更新 更多