我正在尝试构建用户个人资料页面,以显示有关我的用户的一些详细信息。
页面的网址类似于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请求
答案 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没有基于请求的状态,因此它可以安全地应用于作用域。