Mostrar imagen como byte desde la base de datos como imagen gráfica en la página JSF

Tengo contenido de imagen como byte[] desde la base de datos.

 private byte[] image; 

¿Cómo puedo mostrar esa matriz de bytes como una imagen gráfica real en la página JSF?

Esto no es directamente posible con . Solo puede señalar a una URL, no a un byte[] ni a InputStream . Básicamente, debe asegurarse de que esos bytes estén disponibles directamente como una respuesta HTTP en la URL determinada, que luego puede usar en (o incluso en HTML simple ).

Siempre que esté identificando la imagen por su ID así:

  

Aquí hay un ejemplo inicial de dicho 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()); } } 

En esta respuesta , se puede encontrar una plantilla abstracta más avanzada para un servlet de recursos estáticos, que admite caché de HTTP, junto con un ejemplo concreto para servir desde la base de datos.

Si usa la biblioteca de utilidades JSF OmniFaces en un entorno JSF 2.2 + CDI, entonces puede usar su que se puede usar de forma mucho más intuitiva.

  

 @Named @ApplicationScoped public class ImageBean { @EJB private ImageService service; public byte[] getBytes(Long imageId) { return service.getImageBytes(imageId); } }