jsf - 如何在具有 ViewScoped bean 的 View 之间发送数据

标签 jsf jsf-2 parameter-passing

背景:

  • 我有一个 ViewScoped bean,其中包含一个名为 someId 的字段
  • 我有一个页面 somePage.xhtml,其中包含 inputTextcommandLink
  • 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/

相关文章:

c++ - 将对 vector 的引用作为参数传递

sql-server - T-SQL - 在 where 和子句中使用参数

java - 在 jar 中找不到带注释的自定义 JSF2 组件

jsf - 获取组件的坐标

javascript - 调用 a4j :commandButton from javascript on window unload

ajax - JSF 2 Ajax 请求在 IE 9 上失败

java - Tomcat 7 生命周期监听器

java - JSF 2 : page not rerendered on AJAX request (@all and explicit IDs)

jsf-2 - Primefaces p :calendar, 值设置不正确

c - 使用 void 指针传递多个值的参数