在 JSF 数据表中显示来自 MySQL 数据库的图像 [关闭]

Posted

技术标签:

【中文标题】在 JSF 数据表中显示来自 MySQL 数据库的图像 [关闭]【英文标题】:Displaying images from MySQL database in JSF datatable [closed] 【发布时间】:2013-05-31 20:13:09 【问题描述】:

我有 mysql 数据库,它将图像存储在 blob 列中。我想在 PrimeFaces <p:dataTable> 中展示它们。我怎样才能做到这一点?

【问题讨论】:

你试过什么?为什么它不起作用?你的确切错误是什么?您是否尝试过仅将其显示在页面而不是表格中? 可能重复Link @Aquillo :是的,我试过了,但似乎 Primefaces 标记 <p:graphicImage> 需要图像的 url,它不接受从数据库中流式传输 blob 试试这个java.dzone.com/articles/dynamic-images-primefaces 【参考方案1】:

您可以使用<p:graphicImage> 显示存储在byte[] 中的图像,而不管byte[] 源(数据库、磁盘文件系统、网络等)如何。最简单的例子是:

<p:graphicImage value="#bean.streamedContent" />

指的是StreamedContent 属性。

然而,这有一个缺陷,特别是在用于迭代组件(如数据表)时:getter 方法将被调用两次;第一次是JSF自己生成&lt;img src&gt;的URL,第二次是webbrowser需要根据&lt;img src&gt;中的URL下载图片内容的时候。为了提高效率,您不应该在第一个 getter 调用中访问数据库。此外,要参数化 getter 方法调用,以便您可以使用传递特定图像 ID 的通用方法,您应该使用&lt;f:param&gt;(请注意,传递方法参数的 EL 2.2 功能根本不起作用,因为这不会以 &lt;img src&gt;! 的 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 显然返回数据库中图像的唯一标识符(主键),因此 不是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 类在这个特定示例中只是一个 @Entitybytes 属性上带有一个 @Lob(当您使用 JSF 时,我当然假设您正在使用 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);
    


另见:

Display dynamic image from database with p:graphicImage and StreamedContent

【讨论】:

非常感谢。它对我有很大帮助【参考方案2】:

如果您使用的是 Richfaces,则可以使用 a4j:mediaOutput 组件从 bean 流式传输 blob。

如果不是这样,恐怕我对 Primefaces 不熟悉。如果它没有为此提供任何组件,您需要一种生成指向返回 blob 的 servlet 的 URL 的方法。这样您就可以将 h:graphicImage 与自动生成的 URL 一起使用。

【讨论】:

就是这样,不幸的是我正在使用 Primefaces,它不提供像 RichFaces 这样的组件。我找到了一些教程,建议定义一个 Servlet 来返回你所说的 blob……我只是发布这个问题,看看是否有可能以另一种方式做到这一点。感谢任何方式:)

以上是关于在 JSF 数据表中显示来自 MySQL 数据库的图像 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

前台显示和后台 数据库数据不一致, 我用的是JSF ,JPA MYSQL.

JSF和Hibernate从数据库中查找特定记录并显示所有数据的问题[重复]

如何在 JSF 数据表中显示行索引

如何以刷新率在nodejs中显示来自mysql的数据

如何在php中显示来自mysql数据库的html

在 WP Shortcode 中显示来自 mySQL 的数据字段