2

背景:

  • 我有一个ViewScoped名为someId
  • 我有一个页面,somePage.xhtml有一个inputText和一个commandLink
  • inputText 的值在名为searchValue
  • 当我单击链接时,bean 中的一个方法会重定向到另一个searchResult.xhtml使用相同 bean 的页面somePage(尽管不是必需的)

在渲染searchResultbean 之前,需要根据inputText和 变量的值在数据库中执行搜索someId。之后,结果将显示在 中searchResult

是否可以在没有以下情况下执行此操作:

  • 使用SessionScopedbean,或
  • 用 ah:link而不是commandLinkandf:param来表示和由 ajax 更新someId的 get 的值inputText

我也试过Flash了,好像不行preRenderView

4

1 回答 1

2

当您从页面导航到 searchResult.xhtml 时,视图范围的托管 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";
}

3-在get方法的第二个bean中从flash中恢复变量:

public SomeId getSomeId() {
    if (SomeId == null) {
        SomeId =  getFlash().get("SomeId");
    }
    return SomeId;
}

然后你可以在 PreRenderView 或任何地方的方法中使用这个变量。

于 2013-05-29T16:29:37.100 回答