我在类似"Users\name\folder\image.jpg"的目录中有一个图像
如何在jsf中显示图像?
<p:graphicImage value="" width="400px" height="400px" />
知道我该怎么做吗?
来自Primefaces用户指南
3.51图形图像
GraphicImage扩展了标准JSF图形图像组件,能够像输入流一样显示二进制数据。GraphicImage的主要用例是使显示存储在数据库中的图像或动态图像变得更容易。传统的方法是设计一个Servlet来进行流式传输,GraphicImage在不需要Servlet的情况下完成所有的艰苦工作。
GraphicImage入门
GraphicImage需要org.primefaces.model.StreamedContent内容作为动态图像的值。StreamedContent是一个接口,PrimeFaces提供了一个名为DefaultStreamedContent的内置实现。以下示例从类路径加载图像。
<p:graphicImage value="#{imageBean.image}" />
public class ImageBean { private StreamedContent image; public DynamicImageController() { InputStream stream = this.getClass().getResourceAsStream("barcalogo.jpg"); image = new DefaultStreamedContent(stream, "image/jpeg"); } public StreamedContent getImage() { return this.image; } }
DefaultStreamedContent获取inputstream作为第一个参数,mime类型作为第二个参数。在实际应用程序中,可以在从数据库中读取图像后创建输入流。例如,java.sql.ResultSetAPI使用getBinaryStream()方法读取存储在数据库
它的工作原理
动态图像显示的工作原理如下;
- 动态图像对其值表达式字符串进行加密以生成密钥
- 这个键被附加到指向JSF资源处理程序的图像url上
- Custom PrimeFaces ResourceHandler从url中获取密钥,将表达式字符串解密为类似#{bean.streamedContentValue}的内容,对其进行评估以从bean中获取StreamedContent的实例,并将内容流式传输到客户端
因此,将有两个显示图像的请求,第一个浏览器将请求加载页面,然后另一个请求指向指向JSF资源处理程序的动态图像url。请注意,您不能使用viewscopebean,因为它们在资源加载请求中不可用。
传递参数和数据迭代
您可以通过f:param标记将请求参数传递给graphicImage,因此呈现图像的实际请求可以访问这些值。如果您的图像位于数据迭代组件(如datatable或ui:repeat)中,那么显示动态图像非常方便。
流化内容
有两种现成的StreamedContent实现;DefaultStreamedContent不使用InputStream且不可序列化,而可序列化的ByteArrayContent使用字节数组。
使用java.io类从文件系统获取图像的InputStream,而不是像示例中所示那样从类路径加载图像。