0

嗨,我有负责搜索活动的 View 范围 bean。用户输入搜索条件和搜索值后,点击搜索按钮,它会使用搜索结果填充其列表类型属性之一,然后导航到另一个页面,其搜索结果显示在数据表中,该数据表绑定到即将包含的列表搜索结果。但是每当用户搜索并重新加载新页面以显示搜索结果时,都会初始化新的 View 范围 bean。因此它无法显示具有预期搜索结果的数据表。我已经阅读了一些关于此的问题和文章,它被称为因为视图范围的 bean 被初始化到新页面的每个请求。如何解决这个问题。我将该结果列表绑定到 beans(view scoped) List 属性,因为在该列表中我想要搜索结果。

4

1 回答 1

1

您正在通过 POST 执行搜索,这不是幂等/可书签的。像 Google 一样,使用 GET 而不是 POST。在这<f:viewParam>方面非常有帮助。这是一个启动示例:

<f:metadata>
    <f:viewParam id="query" name="query" value="#{bean.query}" />
    <f:event type="preRenderView" listener="#{bean.search}" />
</f:metadata>
...
<form>
    <label for="query">Query</label>
    <input type="text" name="query" value="#{param.query}" />
    <input type="submit" value="Search" />
    <h:message for="query" />
</form>
...
<h:dataTable value="#{bean.results}" var="result" rendered="#{not empty bean.results}">
     ...
</h:dataTable>

基本上这个@RequestScopedbean:

private String query;
private List<Result> results;

public void search() {
    results = service.search(query);
}

提交表单后,您最终会在 URL 中获取搜索查询字符串,使其具有幂等性/可书签性。刷新请求最终会得到完全相同的结果。

于 2013-01-31T11:22:47.377 回答