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

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

【问题讨论】:

    标签: jsf-2 view-scope


    【解决方案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 中获取搜索查询字符串,使其具有幂等性/可书签性。刷新请求最终会得到完全相同的结果。

    【讨论】:

      猜你喜欢
      • 2011-10-24
      • 1970-01-01
      • 2011-09-24
      • 2013-05-08
      • 2012-12-26
      • 2013-12-12
      • 2014-06-30
      • 1970-01-01
      • 2012-11-01
      相关资源
      最近更新 更多