繁体   English   中英

使用分页在数据表中的Primefaces动态图像

[英]Primefaces dynamic image in datatable using pagination

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

问题

// 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返回的很好)。

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

阿卜杜勒

在HTML方面,您具有img元素:

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

如果图像存储在数据库中并且从未更改(上载新图像会在您的实体中创建新的图像ID),则可以为图像创建自定义servlet,从而获得更大的灵活性和性能。

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

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

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

4)将内容写入输出流

加号的是,如果您具有恒定的图像URL和良好的缓存策略,则浏览器将从缓存中获取图像-不必每次都调用Bean。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM