Нужно отобразить изображения находящиеся в BLOB-ах графическим компонентом PrimeFaces <p:galleria> Вот реализация на данный момент -
<p:dataGrid var="car" value="#{postController.cars}" columns="3" rows="12" <!-- Получаем список cars -->
paginator="true" rowsPerPageTemplate="9,12,15"
currentPageReportTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink}
{PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}">
<p:column>
<p:panel header="#{car.autoMark}">
<h:panelGrid columns="1">
<h:outputText value="#{car.autoModel}" />
<p:galleria value="#{imageController.getImagesById(car.id)}" var="image" panelWidth="152" panelHeight="102" showCaption="false"> <!-- Получаем список изображений для конкретной car -->
<p:graphicImage value="/TestImage?imageInBytes=#{image.imageInBytes}" alt="Image Description for #{image.id}" title="#{image.lot_id}" /> <!-- Преобразуем байты в изображения сервлетом -->
</p:galleria>
</h:panelGrid>
</p:panel>
</p:column>
</p:dataGrid>
<p:graphicImage value="/TestImage?imageInBytes=#{image.imageInBytes}" alt="Image Description for #{image.id}" title="#{image.lot_id}" />
<img id="j_idt19:1:j_idt27" src="/PROJECT/TestImage?imageInBytes=[B@2f0aadeb&pfdrid_c=true" alt="Image Description for 1" title="1">
Сейчас 2 проблемы:
1. Не отображаются изображения. Код сервлета - не знаю что тут не так.
response.setContentType("image/jpeg");
try (OutputStream out = response.getOutputStream();) {
byte[] imageInBytes = request.getParameter("imageInBytes").getBytes();
response.setContentLength(imageInBytes.length);
out.write(imageInBytes);
} catch (Exception ex) {
ex.printStackTrace();
}
}
2. Компоненту <p:galleria> передается несколько объектов-изображений, но определяется только одно, при этом в следующем блоке dataGrid в котором свой компонент <p:galleria> со своими изображениями отображается второе изображение из первого компонента <p:galleria>, имхо не отрабатывает внутренний цикл, как исправить эту асинхронность?