【问题标题】:Primefaces dynamic image in datatable using pagination使用分页的数据表中的 Primefaces 动态图像
【发布时间】:2013-09-29 13:56:55
【问题描述】:

我已经成功实现了 BalusC 建议的解决方案,用于在数据表中呈现动态图像(代码在此处进一步发布)。我面临的问题是:

问题

我在数据表中使用 pagination,当我移动到我从未访问过的页面时,图像呈现良好。但是当我返回之前访问过的页面时,即使返回了该图像的 StreamedContent,图像也不会显示。

代码

// ImageBean - SessionScoped        
// Get image for compound
public StreamedContent scaledImageById() {
    FacesContext context = FacesContext.getCurrentInstance();

    if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
        return new DefaultStreamedContent();
    } else {
        String idStr = context.getExternalContext().
                                       getRequestParameterMap().get("id");
        StreamedContent image = scaledCompoundImageMap.
                                              get(Integer.valueOf(idStr));
        return image;
    }
}


// Controller - ViewScoped
<p:dataTable id="cTable" value="#{controller.compoundList}" var="compound">
       <p:column headerText="Structure" style="text-align:center">
          <p:graphicImage id="scaledImage" 
                          value="#{imageBean.scaledImageById()}"     
                          cache="false">
                <f:param name="id" value="#{compound.id}" />
          </p:graphicImage>
       </p:column>   
  ...

因此,当我在分页器中访问新页面时,图像显示正常。但是当我回到一个已经访问过的页面时,图像没有显示(即使 scaledImageById 被调用了两次并且 StreamedContent 被很好地返回)。

如果您需要任何其他代码,请告诉我,我们将不胜感激。谢谢。

阿卜杜勒

【问题讨论】:

  • 浏览器产生了哪些请求?您应该在网络选项卡中的 firebug 下跟踪您的问题。
  • 谢谢卢卡斯。是的,我检查了网络选项卡,我看到 Primefaces 为每个图像生成一个动态 url。像这样的东西:'dynamiccontent.properties.jsf?ln=primefaces&pfdrid=xxxxx&id=13。当我第一次访问分页器时单击它,它可以很好地打开图像,但是当我重新访问页面并打开这样的链接时,没有图像。不知道为什么我下次访问同一页面时该动态链接不起作用。

标签: jsf primefaces datatable pagination dynamic-image-generation


【解决方案1】:

在 HTML 方面,你有 img 元素:

<img src="some_url?id=xyz"/>

如果图像存储在数据库中,并且永远不会更改(上传新图像会在您的实体中创建新的图像 ID),则您可以实现更大的灵活性和性能,为图像创建自定义 servlet。

1) 创建 servlet 并将其绑定到 'some_url'

2) 在 servlet 中,从数据库(或其他任何东西)中读取图像

3) 设置标头,最重要的内容类型和内容长度,以及缓存标头

4) 将内容写入输出流

好处是,如果你有固定的图片 url 和良好的缓存策略,浏览器会从缓存中获取图片 - 不必每次都调用 bean。

【讨论】:

  • 感谢 Lukasz 的解决方案。我现在要试试。知道某些事情并不那么简单,有时会令人沮丧。显然,Primefaces 并不是一种技术万能的解决方案。来自 Flex 的背景,我觉得我需要做很多变通方法(主要是为了理解构建/查看/渲染和生命周期阶段)来达到预期的结果,这对开发人员来说有点负担。我将继续在街区寻找新的包裹并将继续探索。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 2014-08-08
  • 2013-02-17
  • 2015-06-09
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
相关资源
最近更新 更多