当前位置: 首页 > 面试题库 >

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

欧阳嘉年
2023-03-14
问题内容

很难说出这里的要求。这个问题是模棱两可的,模糊的,不完整的,过于广泛的或修辞性的,不能以目前的形式合理地回答。如需帮助澄清此问题以便可以重新打开,
请访问帮助中心。

6年前关闭。

我有将图像存储在blob列中的MySQL数据库。我想在PrimeFaces中展示它们<p:dataTable>。我该如何实现?


问题答案:

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

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

指的是StreamedContent财产。

但是,这有一个陷阱,尤其是在用于数据表之类的迭代组件中时:getter方法将被调用两次;第一次由JSF本身生成URL,<img src>第二次由webbrowser生成,它需要基于中的URL下载图像内容<img src>。为了提高效率,您不应在第一个getter调用中访问数据库。另外,要对getter方法调用进行参数化,以便可以使用传递特定图像ID的通用方法,则应使用<f:param>(请注意,传递方法参数的EL
2.2功能根本无法使用,因为这样做不行。不能以URL开头<img src>!)。

总结起来,这应该做到:

<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的图像的独特idenfitier(主键),从而
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具有@Lobon
bytes属性的类(当您使用JSF时,我当然假定您正在使用JPA与DB进行交互)。

@Entity
public class Image {

    @Id
    @GeneratedValue(strategy = IDENTITY) // Depending on your DB, of course.
    private Long id;

    @Lob
    private byte[] bytes;

    // ...
}

ImageService仅仅是一个标准的@StatelessEJB,没有什么特别在这里看到:

@Stateless
public class ImageService {

    @PersistenceContext
    private EntityManager em;

    public Image find(Long id) {
        return em.find(Image.class, id);
    }

}

也可以看看:

  • 使用p:graphicImage和StreamedContent从数据库显示动态图像


 类似资料:
  • 问题内容: 此代码将图片test.gif放入图片位值中。 我的下一个目标是显示以字节为单位保存在数据库中的图片。如何才能做到这一点 ? 问题答案: 就像是: 可能为您工作。

  • 问题内容: 我正在尝试显示从blob数据类型的MySQL数据库检索的图像。无法找出是什么原因导致图像列显示这样的数据而不是图像图标。 … 问题答案: 由于您曾经存储图像,因此我必须假定您存储的是物理图像文件/格式,而不仅仅是像素数据。 您需要回读此图像格式并将其转换为Swing / Java支持的图像格式。 首先获取对数据库字段的引用… 一旦有了,就可以使用它的二进制文件并读取数据… 现在,你可以

  • 问题内容: 我有一个JSF数据表,它有三列,分别是:Work_Type_Desc,Project_Phase和Activity_Desc。这些列来自2个不同的数据库表,这两个表之间的关系是一对多的。 第一个表的名称为Work_Type。它具有1)Work_Type_Cd,2)Work_Type_Desc,3)Created_By_Name,4)Created_DT,5)Updated_By_Nam

  • 我只需要一个简单的查询, 下面是我的桌子: Information->id_info,year,information_name,person_name,country_id,state_id,city_id country->id,country_id,country_name state->id,state_id,country_id,state_name city->id,city_id,s

  • 我有一个,如下所示,它可以从CMS/Database中提取数据。  反应代码: Z行打印以下内容: 问题说明:在上面的代码中,中的div没有打印任何内容,尽管我能够在中显示所有内容。

  • 我想在JTable中显示MySQL中的数据,但只显示了表中的最后一行。请帮帮我。我知道我有一个问题,因为jt=newjtable(数据,列)每次都为每行创建一个新表(删除之前的),但我找不到正确的选项。