在JSF页面中将图像显示为来自数据库的byte 图像

我有从数据库的byte[]图像内容。

 private byte[] image; 

如何在JSF页面中将该字节数组显示为真正的graphics图像?

这不能直接用<h:graphicImage> 。 它只能指向一个URL,而不是一个byte[]InputStream 。 基本上,您需要确保这些字节可以直接作为给定URL上的HTTP响应来使用,然后可以在<h:graphicImage> (甚至纯HTML <img> )中使用。

假设您通过其ID来识别图像,如下所示:

 <h:graphicImage value="/image/#{someBean.imageId}" /> 

这是一个这样的servlet的开创性的例子:

 @WebServlet("/image/*") public class ImageServlet extends HttpServlet { @EJB private ImageService service; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Long id = Long.valueOf(request.getPathInfo().substring(1)); Image image = service.find(id); response.setContentType(getServletContext().getMimeType(image.getName())); response.setContentLength(image.getBytes().length); response.getOutputStream().write(image.getBytes()); } } 

在这个答案中可以find支持HTTPcaching的静态资源servlet的更高级的抽象模板,以及数据库服务的具体示例。

如果您碰巧在JSF 2.2 + CDI环境中使用JSF实用程序库OmniFaces ,则可以使用更直观的<o:graphicImage>

 <o:graphicImage value="#{imageBean.getBytes(someBean.imageId)}" /> 
 @Named @ApplicationScoped public class ImageBean { @EJB private ImageService service; public byte[] getBytes(Long imageId) { return service.getImageBytes(imageId); } }