gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:41:47 24 4
gpt4 key购买 nike

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

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

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

一切顺利,因为现在是显示用户图像的时刻。

我将 PrimeFaces 与 graphicImage 组件一起使用,但问题是它会导致获取图像的新请求,因此请求参数实际上丢失了并且 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>

(我使用这个变量是因为如果页面请求只是 profile.xhtml 而没有参数,我希望显示登录用户的个人资料)

托管 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 请求

最佳答案

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

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

#{images} helper 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()));
}
}

}

由于上面的 helper bean 没有基于请求的状态,所以它可以安全地处于应用程序范围内。

关于jsf - 显示依赖于请求参数的动态图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10362786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com