我在datagrid列中显示图片时遇到问题。加载Datagrid时,它会正确显示图像,但每当我点击第二页或刷新第一页时,图像就会消失。我注意到在控制台中,单击第二页或刷新页面使param值为null。这就是图像没有显示的原因。我正在使用sessioncoped。以下是我的代码:
public StreamedContent getStreamedImageById() {
FacesContext context = FacesContext.getCurrentInstance();
if (context.getRenderResponse()) {
// So, we're rendering the view. Return a stub StreamedContent so that it will generate right URL.
System.out.println("check");
return new DefaultStreamedContent();
}
else {
// So, browser is requesting the image. Get ID value from actual request param.
String firstName = context.getExternalContext().getRequestParameterMap().get("firstName");
System.out.println("Name:"+firstName);
System.out.println("Image::"+images.get(firstName));
return images.get(firstName);
}
在搜索方法中,我只是将所有图像都放在哈希映射中。
while(itr.hasNext()){
com.sysvana.request.UserBean us=itr.next();
images.put(us.getFirstName(), stringToStreamedContent(us.getJpegPhoto()));
}
这是我的xhtml ::
<p:graphicImage value="#{userManagementActionBean.streamedImageById}" height="40" width="50" style="align:center" >
<f:param id="firstName" name="firstName" value="#{user.firstName}" />
</p:graphicImage>
答案 0 :(得分:1)
此,
return images.get(firstName);
不对。您应该创建流式内容,而不是返回先前在先前的HTTP请求中创建的内容。重点是您不应该在之前的HTTP请求中创建它,而是直接在调用getStreamedImageById()
方法的同一HTTP请求中创建它。
修复如下(假设userBean.getJpegPhoto()
返回byte[]
)
UserBean userBean = userService.findByFirstName(firstName);
return new DefaultStreamedContent(new ByteArrayInputStream(userBean.getJpegPhoto()));
无关,方法名称stringToStreamedContent()
表明存在一个主要问题。图像绝对不能表示为String
,而应表示为byte[]
。将图像视为String
时,由于字符编码问题导致信息丢失,您可能最终会出现损坏的图像。您应该从数据库中获取byte[]
或InputStream
。