从视图范围的托管 bean JSF 填充数据表

Posted

技术标签:

【中文标题】从视图范围的托管 bean JSF 填充数据表【英文标题】:populate Data Table from View scoped managed bean JSF 【发布时间】:2013-01-15 03:46:08 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您正在执行不是idempotent/bookmarkable 的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>

基本上有了这个@RequestScoped bean:

private String query;
private List<Result> results;

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

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

【讨论】:

以上是关于从视图范围的托管 bean JSF 填充数据表的主要内容,如果未能解决你的问题,请参考以下文章

将 JSF 托管 bean 迁移到 CDI 托管 bean

Observer和JSF ManagedBean

在 Web 过滤器中访问会话范围的 JSF 托管 bean

JSF 托管 bean 如何比普通的 Javax Servlet 更有益[重复]

JSF 2 应用程序中的默认托管 Bean 范围是啥?

当通过链接或后退按钮打开时,强制 JSF 刷新页面/视图/表单