我有一个包含一些图像的数据库。谁能解释一下如何在 JSF 页面中加载图像?
我已经有一个托管 bean,可以将 Image 对象转换为流内容。该流内容是从标签中的页面调用的<h:graphicImage>
,但是当我检查页面的源代码时,没有src
可以加载图像的位置。
The JSF <h:graphicImage>
呈现为 HTML<img>
元素。它是src
属性应该指向 URL,而不是二进制内容。因此,您应该将 URL(或至少一些标识符作为请求参数或路径信息)存储在 JSF bean 中,并创建一个单独的 servlet 将图像从 DB 流式传输到 HTTP 响应。
在您的 JSF 页面中使用它:
<h:graphicImage value="images/#{bean.imageId}">
假如说bean.getImageId()
回报123
,这在 HTML 中呈现为:
<img src="images/123">
创建一个Servlet
映射到的类web.xml
on an url-pattern
of /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) {}
}
In the ImageDAO#find()
您可以使用ResultSet#getBinaryStream()将图像作为InputStream
从数据库中。
可以在以下位置找到扩展示例本文.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)