显示依赖于请求参数的动态图像

时间:2012-04-28 10:44:27

标签: jsf primefaces bytearray

我正在尝试构建用户个人资料页面,以显示有关我的用户的一些详细信息。

页面的网址类似于profile.xhtml?username=randomString

所以,我要做的是加载randomString用户的所有数据。

一切都很好,因为它是展示用户形象的时刻。

我正在使用带有graphicImage组件的PrimeFaces,但问题是它导致获取图像的新请求,因此请求参数实际上丢失了,getAvatar()方法接收到空参数。

一个解决方案可能是使用SessionScoped bean,但它会从第一个请求的用户获取数据,即使randomString会改变,它也会显示它们,所以我正在寻求帮助:

如何从数据库中显示依赖于请求参数的动态图像?

谢谢:)

编辑:BalusC回复后的新代码

JSF页面:

<c:set value="#{request.getParameter('user')}" var="requestedUser"/>                    
<c:set value="#{(requestedUser==null) ? loginBean.utente : userDataBean.findUtente(request.getParameter('user'))}" var="utente"/>
<c:set value="#{utente.equals(loginBean.utente)}" var="isMyProfile"/>
<pou:graphicImage value="#{userDataBean.avatar}">
    <f:param name="username" value="#{utente.username}"/>
</pou:graphicImage>

(我正在使用此变量,因为如果页面请求只是profile.xhtml没有参数,我希望显示已记录用户的配置文件)

Managed Bean:

@ManagedBean
@ApplicationScoped
public class UserDataBean {

    @EJB
    private UserManagerLocal userManager;

    /**
     * Creates a new instance of UserDataBean
     */
    public UserDataBean() {
    }

    public Utente findUtente(String username) {
        return userManager.getUtente(username);
    }

    public StreamedContent getAvatar(){
        String username = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("username");
        System.out.println(username==null);
        Utente u = findUtente(username);
        return new DefaultStreamedContent(new ByteArrayInputStream(u.getFoto()));
    }
}

它出了什么问题? 用户名始终为空!

编辑2:添加了对BalusC的回复

是的,因为getAvatar()方法调用findUser()因为我需要找到用户的实体,并且用户名作为参数传递(<f:param>将不允许我传递对象!)

所以findUser()会引发异常,因为我正在使用带有entityManager.find()主键的null

顺便说一句,我绝对相信#{utente}#{utente.username}都不为空,因为只有当#{utente ne null}username为其时才会呈现包含图片的面板主键!

所以我无法真正检查HTML输出!

当我致电#{utente}时,我担心getAvatar()丢失,因为获取图片需要新的http请求

1 个答案:

答案 0 :(得分:7)

将其传递为<f:param>。它将在渲染响应期间添加。

<p:graphicImage value="#{images.image}">
    <f:param name="id" value="#{someBean.imageId}" />
</p:graphicImage>

#{images}辅助bean可能如下所示:

@ManagedBean
@ApplicationScoped
public class Images {

    @EJB
    private ImageService service;

    public StreamedContent getImage() throws IOException {
        FacesContext context = FacesContext.getCurrentInstance();

        if (context.getRenderResponse()) {
            // So, we're rendering the view. Return a stub StreamedContent so that it will generate right URL.
            return new DefaultStreamedContent();
        }
        else {
            // So, browser is requesting the image. Get ID value from actual request param.
            String id = context.getExternalContext().getRequestParameterMap().get("id");
            Image image = service.find(Long.valueOf(id));
            return new DefaultStreamedContent(new ByteArrayInputStream(image.getBytes()));
        }
    }

}

由于上面的帮助bean没有基于请求的状态,因此它可以安全地应用于作用域。