JSF更新h:graphicImage

时间:2014-07-12 03:26:39

标签: jsf-2 primefaces

我正在使用来自primefaces的poll来每n秒更新一次图像。我现在正在两张图片之间翻转,以确保它正常工作。现在我要做的是显示未存储在服务器上的图像。我写了一个每隔n秒拍摄一张照片的课程。我不想将其保存到磁盘以减少IO。所以我想做类似以下流程的事情

@ManagedBean
@ViewScoped
public class myClass implements Serializable {
  public Object getImage() {
    Object newImage = MyClass.takePhoto();
    return newImage;
  }

  public void increment() {
  }
}

XHTML:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head></h:head>
    <h:body>
      <h:form>
        <h:graphicImage value="#{myClass.image}" id="img" cache="false"/>
        <p:poll interval="1" listener="#{myClass.increment}" update="img" />
      </h:form>
    </h:body>
</h:html>

所以我的问题是,是否有可能以与上述伪代码类似的方式将Image对象返回到h:graphicImage?

1 个答案:

答案 0 :(得分:3)

是的,尝试使用Primefaces StreamedContent类为graphicImage而不是对象提供流。

类似的东西:

public StreamedContent getImageStream() {

    ByteArrayOutputStream os = new ByteArrayOutputStream();
    ImageIO.write(myBufferedImage, "png", os);
    InputStream is = new ByteArrayInputStream(os.toByteArray());
    return new DefaultStreamedContent(is, "image/png");

}

然后在你的JSF页面中:

<p:graphicImage value="#{myController.imageStream}" cache="false"/>

请注意,这使用p:graphicImage,而不是h:graphicImage。