2

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

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

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

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

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

一种解决方案可能是制作 bean SessionScoped,但它会从第一个请求的用户那里获取数据,即使 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>

(我使用这个 vars 是因为我希望在页面请求profile.xhtml不带参数的情况下显示登录用户的个人资料)

托管豆:

@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 请求

4

1 回答 1

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 没有基于请求的状态,它可以安全地在应用程序范围内。

于 2012-04-28T12:24:25.560 回答