从View作用域的托管bean JSF填充数据表

时间:2013-01-31 05:24:07

标签: jsf-2 view-scope

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

1 个答案:

答案 0 :(得分:1)

您正在通过POST执行搜索,该搜索不是idempotent /可收藏。像谷歌一样,使用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>

基本上使用这个@RequestScoped bean:

private String query;
private List<Result> results;

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

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