背景:
ViewScoped
bean,其中包含一个名为someId
somePage.xhtml
,其中包含inputText
和commandLink
searchValue
searchResult.xhtml
的页面,该页面使用与somePage
相同的bean(尽管不是必需的)在渲染searchResult
之前,bean需要根据inputText
和变量someId
的值在数据库中执行搜索。之后,结果将显示在searchResult
。
有没有可能做到这一点:
SessionScoped
bean或h:link
代替commandLink
,让f:param
代表someId
,inputText
的价值由ajax更新我也尝试了Flash
,但似乎无法使用preRenderView
。
答案 0 :(得分:2)
当您从页面导航到searchResult.xhtml时,将重新创建View作用域托管bean,因为在导航发生之前,视图范围bean仍然存在,因此您的问题应解决如下:
1 - 在视图范围内为searchResult.xhtml页面创建另一个托管bean,并使用set和get方法定义变量someId
2 - 在命令链接上(在你的第一个bean中)定义一个动作方法,将someId的值保存在flash范围中,然后导航到带有重定向的searchResult.xhtml
public String navigatetosearch() {
FacesContext.getCurrentInstance().getExternalContext().getFlash().put("someId", someId );
return "/pages/searchResult?faces-redirect=true";
}
在get方法的第二个bean中3 - 从flash恢复变量:
public SomeId getSomeId() {
if (SomeId == null) {
SomeId = getFlash().get("SomeId");
}
return SomeId;
}
然后您可以在PreRenderView或任何地方的方法中使用此变量。