<p:graphicImage>
を使用できます
byte[]
に保存されている画像を表示します 、byte[]
に関係なく ソース(DB、ディスクファイルシステム、ネットワークなど)。最も簡単な例は次のとおりです。
<p:graphicImage value="#{bean.streamedContent}" />
StreamedContent
を参照します プロパティ。
ただし、これには落とし穴があります。特に、データテーブルなどの反復コンポーネントで使用する場合は、getterメソッドが2回呼び出されます。 JSF自体が初めて<img src>
のURLを生成しました 2回目は、<img src>
のURLに基づいて画像コンテンツをダウンロードする必要がある場合にwebbrowserによって行われます。 。効率的にするには、最初のゲッター呼び出しでDBをヒットしないようにする必要があります。また、getterメソッド呼び出しをパラメーター化して、特定の画像IDを渡す一般的なメソッドを使用できるようにするには、<f:param>
を使用する必要があります。 (メソッド引数を渡すEL 2.2機能は、<img src>
のURLに到達しないため、まったく機能しないことに注意してください。 !)。
要約すると、これは次のことを行う必要があります:
<p:dataTable value="#{bean.items}" var="item">
<p:column>
<p:graphicImage value="#{imageStreamer.image}">
<f:param name="id" value="#{item.imageId}" />
</p:graphicImage>
</p:column>
</p:dataTable>
#{item.imageId}
明らかに、DB内の画像の一意の識別子(主キー)を返すため、 byte[]
コンテンツ。 #{imageStreamer}
は、次のようなアプリケーションスコープのBeanです:
@ManagedBean
@ApplicationScoped
public class ImageStreamer {
@EJB
private ImageService service;
public StreamedContent getImage() throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
// So, we're rendering the HTML. Return a stub StreamedContent so that it will generate right URL.
return new DefaultStreamedContent();
} else {
// So, browser is requesting the image. Return a real StreamedContent with the image bytes.
String imageId = context.getExternalContext().getRequestParameterMap().get("imageId");
Image image = imageService.find(Long.valueOf(imageId));
return new DefaultStreamedContent(new ByteArrayInputStream(image.getBytes()));
}
}
}
Image
この特定の例では、クラスは単なる@Entity
です。 @Lob
を使用 bytes
プロパティ(JSFを使用しているため、私は、DBとの対話にJPAを使用していると想定しています)。
@Entity
public class Image {
@Id
@GeneratedValue(strategy = IDENTITY) // Depending on your DB, of course.
private Long id;
@Lob
private byte[] bytes;
// ...
}
ImageService
単なる標準の@Stateless
EJB、ここで特別なことは何もありません:
@Stateless
public class ImageService {
@PersistenceContext
private EntityManager em;
public Image find(Long id) {
return em.find(Image.class, id);
}
}