我正在使用来自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?
答案 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。