我正在使用带有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}" />
返回:
java.io.FileNotFoundException:\ images \ reddot.png
我很欣赏在显示表单代码时如何存储图像的最佳实践以及如何操作。
答案 0 :(得分:4)
由于您的图片位于您的网络文件夹中,因此您不需要使用DefaultStreamedContent。对于动态生成的图像,我只留下 。
对于您的情况,我只是创建一个简单的方法,根据布尔变量返回图像路径(在您的Web文件夹中)。像这样:
public String getImagePath(){
return connected ? "/images/greendot.png" : "/images/reddot.png";
}
在graphicImage上,您可以参考:
<p:graphicImage value="#{yourBean.imagePath}"/>
请注意,如果您的Web上下文不是root用户,则可能需要调整graphicImage标记。
修改强> 你实际上可以使这更简单:
<p:graphicImage value="#{yourBean.connected ? '/images/greendot.png' : '/images/reddot.png'}"/>
确保为连接的属性设置一个getter。
答案 1 :(得分:2)
按如下方式创建StreamedContent
:
bStatus = new DefaultStreamedContent(FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/images/greendot.png"), "image/jpeg");
当您创建new File()
时,这将是您磁盘中的绝对路径,而不仅仅是您的应用程序。