Jsf 使用分页在数据表中创建动态图像

Jsf 使用分页在数据表中创建动态图像,jsf,primefaces,datatable,pagination,dynamic-image-generation,Jsf,Primefaces,Datatable,Pagination,Dynamic Image Generation,我已经成功地实现了BalusC建议的在datatable中呈现动态图像的解决方案(代码发布在下面)。我面临的问题是: 发行 我在datatable中使用分页,当我移动到我从未访问过的页面时,图像呈现良好。但是当我回到我之前访问过的页面时,即使返回了该图像的StreamedContent,图像也不会显示 代码 //ImageBean-会话范围 //获取化合物的图像 public StreamedContent scaledImageById(){ FacesContext context=Face

我已经成功地实现了BalusC建议的在datatable中呈现动态图像的解决方案(代码发布在下面)。我面临的问题是:

发行

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

代码

//ImageBean-会话范围
//获取化合物的图像
public StreamedContent scaledImageById(){
FacesContext context=FacesContext.getCurrentInstance();
if(context.getCurrentPhaseId()==PhaseId.RENDER_响应){
返回新的DefaultStreamedContent();
}否则{
字符串idStr=context.getExternalContext()。
getRequestParameterMap().get(“id”);
StreamedContent图像=缩放的复合图像映射。
get(Integer.valueOf(idStr));
返回图像;
}
}
//控制器-可视范围
...
因此,当我在paginator中访问新页面时,图像显示良好。但是,当我回到已经访问过的页面时,图像不会显示(即使scaledImageById被调用了两次,StreamedContent返回的很好)

请让我知道,如果你需要任何其他代码在这里和任何帮助将不胜感激。谢谢


Abdul

在HTML端,您有img元素:

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

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

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

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

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

4) 将内容写入输出流


另外,如果您有固定的图像url和良好的缓存策略,浏览器将从缓存中获取图像-不必每次都调用bean。

浏览器会生成哪些请求?您应该在网络选项卡的firebug下跟踪您的问题。谢谢Lukasz。是的,我检查了网络选项卡,看到Primefaces为每个图像生成了一个动态url。类似这样的内容:“dynamiccontent.properties.jsf?ln=primefaces&pfdrid=xxxxx&id=13。当我第一次访问paginator时点击它,它会很好地打开图像,但是当我再次访问页面并打开这样的链接时,没有图像。不知道为什么下次我访问同一个页面时动态链接不起作用。感谢Lukasz提供的解决方案。我现在就试试看。知道某些事情并非如此直截了当,有时令人沮丧。显然,Primefaces并不是一种适用于所有人的技术解决方案。来自Flex背景,我觉得我需要做很多变通方法(主要是理解构建/查看/渲染和生命周期阶段),以实现期望的结果,这对开发人员来说是一点负担。我将继续在街区寻找新的包裹,并将继续探索。再次感谢。
<img src="some_url?id=xyz"/>