背景:
- 我有一个
ViewScoped
bean,其中包含一个名为someId
的字段 - 我有一个页面
somePage.xhtml
,其中包含inputText
和commandLink
- inputText 的值在名为
searchValue
的 bean 中有一个相应的字段 - 当我单击链接时,bean 中的方法会重定向到另一个名为
searchResult.xhtml
的页面,该页面使用与somePage
相同的 bean(尽管不是必需的)<
在渲染 searchResult
之前,bean 需要根据 inputText
的值和变量 someId
在数据库中执行搜索。之后结果将显示在 searchResult
中。
是否可以在没有以下内容的情况下做到这一点:
- 使用
SessionScoped
bean,或 - 使用
h:link
代替commandLink
并让f:param
代表someId
并且inputText
的值通过 ajax 更新
我也尝试过 Flash
,但它似乎不可用 preRenderView
。
最佳答案
当您从页面导航到 searchResult.xhtml 时,会重新创建 View 作用域托管 bean,因为 View 作用域 bean 在导航发生之前仍然处于事件状态,因此您的问题应如下解决:
1-在 searchResult.xhtml 页面的 View 中创建另一个托管 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";
}
3-在get方法中的第二个bean中从flash恢复变量:
public SomeId getSomeId() {
if (SomeId == null) {
SomeId = getFlash().get("SomeId");
}
return SomeId;
}
然后您可以在 PreRenderView 或任何地方的方法中使用此变量。
关于jsf - 如何在具有 ViewScoped bean 的 View 之间发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16817395/