我已经成功实现了BalusC建议的解决方案,用于在数据表中渲染动态图像(此处进一步发布的代码)。我面临的问题是:
问题
我正在数据表中使用分页,当我移动到我从未访问过的页面时,图像渲染得很好。但是当我回到之前访问过的页面时,即使为该图像返回了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被返回正常)。
如果您在此处需要任何其他代码,请告知我们,我们非常感谢您提供任何帮助。感谢。
阿都
答案 0 :(得分:0)
从HTML方面,你有img元素:
<img src="some_url?id=xyz"/>
如果图像存储在数据库中,并且永远不会更改(上传新图像在您的实体中创建新的图像ID),您可以获得更多的灵活性和性能,为图像创建自定义servlet。
1)创建servlet并将其绑定到'some_url'
2)在servlet中,从数据库(或其他任何东西)读取图像
3)设置标题,最重要的内容类型和内容长度以及缓存标题
4)将内容写入输出流
优点是,如果你有图像的常量url和良好的缓存策略,浏览器将从缓存中获取图像 - 每次都不需要调用bean。