如何在具有ViewScoped bean的视图之间发送数据

时间:2013-05-29 15:01:21

标签: 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代表someIdinputText的价值由ajax更新

我也尝试了Flash,但似乎无法使用preRenderView

1 个答案:

答案 0 :(得分:2)

当您从页面导航到searchResult.xhtml时,将重新创建View作用域托管bean,因为在导航发生之前,视图范围bean仍然存在,因此您的问题应解决如下:

1 - 在视图范围内为searchResult.xhtml页面创建另一个托管bean,并使用set和get方法定义变量some​​Id

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或任何地方的方法中使用此变量。