我正在使用带primefaces的JSF,并希望显示来自java代码的图像。
我已经看过http://www.primefaces.org/showcase/ui/dynamicImage.jsf
的教程但我不清楚如何才能正确获取图像文件的路径:
代码:豆:
@ManagedBean
public class ABean {
private StreamedContent bStatus;
public ABean() {
try {
Boolean connected = false;
if (connected == true) {
bStatus = new DefaultStreamedContent(new FileInputStream(new File("/images/greendot.png")), "image/jpeg");
} else {
bStatus = new DefaultStreamedContent(new FileInputStream(new File("/images/reddot.png")), "image/jpeg");
}
} catch(Exception e) {
e.printStackTrace();
}
}
public StreamedContent getBStatus() {
return bStatus;
}
public void setBStatus(StreamedContent bStatus) {
this.bStatus = bStatus;
}
}
xhtml: <p:graphicImage value="#{ABean.bStatus}" />
的回报:
. io .FileNotFoundException: imagesreddot.png
我将欣赏最佳实践在哪里存储我的图像时,显示它的形式代码,以及如何做到这一点。
既然你的图像在你的web文件夹中,你真的不需要使用DefaultStreamedContent。我将把只留给动态生成的图像。
对于您的情况,我只是创建一个简单的方法,根据布尔变量返回图像路径(在您的web文件夹中)。像这样:
public String getImagePath(){
return connected ? "/images/greendot.png" : "/images/reddot.png";
}
在graphicImage中,你可以引用它:
<p:graphicImage value="#{yourBean.imagePath}"/>
注意,如果你的web上下文不是根,你可能需要调整graphicImage标签。
编辑你可以让它更简单:
<p:graphicImage value="#{yourBean.connected ? '/images/greendot.png' : '/images/reddot.png'}"/>
按如下方式创建StreamedContent
:
bStatus = new DefaultStreamedContent(FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/images/greendot.png"), "image/jpeg");
当您创建new File()
时,这将是磁盘中的绝对路径,而不仅仅是在您的应用程序中。