sql >> データベース >  >> RDS >> Mysql

MySQLデータベースの画像をJSFデータテーブルに表示する

    <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);
        }
    
    }
    

    関連項目:



    1. 「Intelのデフォルトプレフィックス(/ usr / local)のARMプロセッサのHomebrewにインストールできません!」を修正しました。

    2. MariaDBMaxScale2.4の新機能

    3. データベースの正規化について知っておくべきことすべて

    4. 別のテーブルの行の値から派生した列名でテーブルを作成します