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

时间:2010-05-17 12:24:38

标签: image jsf load

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

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

1 个答案:

答案 0 :(得分:12)

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

在JSF页面中使用它:

<h:graphicImage value="images/#{bean.imageId}">

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

<img src="images/123">

创建一个Servlet类,该web.xml类在url-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) {} } 方法。

ImageDAO#find()

InputStream中,您可以使用ResultSet#getBinaryStream()this article作为{{1}}从数据库中使用。

可以在{{3}}中找到扩展示例。