图形图像未在Datagrid PrimeFaces中显示

时间:2013-01-17 05:24:53

标签: jsf-2 primefaces

我在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>

1 个答案:

答案 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