您好我有View scoped bean负责搜索活动。用户输入搜索条件和搜索值后,点击搜索按钮,它会使用搜索结果填充其中一个列表类型属性,然后导航到另一个页面,其搜索结果显示在数据表中,该数据表绑定到即将包含的列表搜索结果。但是每当用户搜索并重新加载新页面以显示搜索结果时,都会初始化新的View作用域bean。因此,它无法显示具有预期搜索结果的数据表。我已经阅读了几个关于它的问题和文章,因为每个对新页面的请求都会初始化视图范围bean。如何解决此问题。我将结果列表表绑定到bean(视图作用域)List属性,因为在该列表中我想要搜索结果。
答案 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中获取搜索查询字符串,使其成为幂等/可收藏的。刷新请求最终会得到完全相同的结果。