Короткий ответ: вам нужно выполнить обратный вызов следующим образом:
function callback(response) {
// Here you can do what ever you want with the response object.
console.log(response);
}
$.ajax({
url: "...",
success: callback
});
Это невозможно напрямую с <h:graphicImage>
. Он может указывать только на URL, а не на byte[]
или InputStream
. В принципе, вам нужно убедиться, что эти байты напрямую доступны в качестве ответа HTTP по данному URL-адресу, который затем можно использовать в <h:graphicImage>
(или даже в обычном HTML <img>
).
При условии, что вы идентифицируете изображение по его ID так:
<h:graphicImage value="/image/#{someBean.imageId}" />
Вот пример запуска такого сервлета:
@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());
}
}
Более продвинутый абстрактный шаблон для статического ресурса сервлет, поддерживающий HTTP-кеширование, можно найти в этом ответе , а также конкретный пример для обслуживания из базы данных.
Если вы используете библиотеку служебных программ JSF OmniFaces в среде JSF 2.2 + CDI, вы можете вместо этого использовать свой <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);
}
}