我在像“Users \ name \ folder \ image.jpg”这样的目录中有一个图像
如何在jsf中显示图像?
<p:graphicImage value="" width="400px" height="400px" />
知道我怎么能这样做吗?
答案 0 :(得分:0)
3.51 GraphicImage
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将输入流作为第一个参数,将mime类型作为第二个参数。在实际应用程序中,您可以在从数据库中读取图像后创建输入流。例如 java.sql.ResultsSet API有getBinaryStream()方法来读取存储的blob文件 数据库中。
...
如何运作
动态图像显示的工作原理如下;
- 动态图像加密其值表达式字符串以生成密钥。
- 此键附加到指向JSF资源处理程序的图像URL。
- 自定义PrimeFaces ResourceHandler从url获取密钥,将表达式字符串解密为#{bean.streamedContentValue},对其进行评估以从bean获取StreamedContent实例并将内容流式传输到客户端。
因此,将有2个显示图像的请求,第一个浏览器将发出加载页面的请求,然后另一个请求指向指向JSF资源处理程序的动态图像URL。请注意,您不能使用viewscope bean,因为它们在资源加载请求中不可用。
传递参数和数据迭代
您可以通过f:param标记将请求参数传递给graphicImage,因此呈现图像的实际请求可以访问这些值。如果您的图像位于数据迭代组件(如datatable或ui:repeat)中,则显示动态图像非常方便。
<强> StreamedContent 强>
开箱即用的两个StreamedContent实现; DefaultStreamedContent不使用InputStream而不是可序列化,而可序列化的ByteArrayContent使用字节数组。
不使用示例中所示的类路径加载图像,而是使用 java.io 类从文件系统中获取图像的 InputStream 。