如何使用托管bean从JSF页面内的数据库加载图像?

Rhi*_*oHR 5 jsf load image

我有一个带有一些图像的数据库.任何人都可以解释我如何在JSF页面中加载图像?

我已经有一个托管bean,可以将Image对象转换为streamcontent.此流内容是从标记中的页面调用的<h:graphicImage>,但是当我检查页面的源代码时,没有src可以加载图像的位置.

Bal*_*usC 12

JSF <h:graphicImage>作为HTML <img>元素呈现.其src属性应指向URL,而不是二进制内容.因此,您应该将URL(或至少一些标识符作为请求参数或pathinfo)存储在JSF bean中,并创建一个单独的servlet以将映像从数据库流式传输到HTTP响应.

在JSF页面中使用它:

<h:graphicImage value="images/#{bean.imageId}">
Run Code Online (Sandbox Code Playgroud)

假设bean.getImageId()返回123,这将在HTML中呈现为:

<img src="images/123">
Run Code Online (Sandbox Code Playgroud)

创建Servlet其被映射在类web.xmlurl-pattern/images/*并执行其doGet()方法如下:

Long imageId = Long.valueOf(request.getPathInfo().substring(1)); // 123 (PS: don't forget to handle any exceptions).
Image image = imageDAO.find(imageId); // Get Image from DB.
// Image class is just a Javabean with the following properties:
// private String filename;
// private Long length;
// private InputStream content;

response.setHeader("Content-Type", getServletContext().getMimeType(image.getFilename()));
response.setHeader("Content-Length", image.getLength());
response.setHeader("Content-Disposition", "inline; filename=\"" + image.getFilename() + "\"");

BufferedInputStream input = null;
BufferedOutputStream output = null;

try {
    input = new BufferedInputStream(image.getContent());
    output = new BufferedOutputStream(response.getOutputStream());
    byte[] buffer = new byte[8192];
    int length;
    while ((length = input.read(buffer)) > 0) {
        output.write(buffer, 0, length);
    }
} finally {
    if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
    if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
}
Run Code Online (Sandbox Code Playgroud)

ImageDAO#find()您可以使用来自数据库ResultSet#getBinaryStream()的图像InputStream.

可以在本文中找到扩展示例.