具有分页和排序以及浏览器返回的 JSF 数据表

Posted

技术标签:

【中文标题】具有分页和排序以及浏览器返回的 JSF 数据表【英文标题】:JSF datatable with paging and sorting and browser-back 【发布时间】:2012-04-02 11:48:50 【问题描述】:

我们使用带有排序、分页和LazyDataModel 的 Primefaces 数据表组件来显示搜索结果。搜索页面的支持 bean 是ViewScoped

用户可以从搜索结果列表中选择一个结果项以查看详细信息。这被实现为一个新的页面请求,例如<h:link value="Show Details" outcome="showDetails?id=11234"/>。通过单击浏览器返回按钮,用户将导航回搜索结果列表。

问题是数据表将再次处于初始状态,因此它不会显示最后选择的排序顺序和页面。大多数浏览器都是这种情况,只有 Firefox 11 似乎将这些 DOM 更改保留在缓存中。 IE 和 Chrome 都不是。

有没有人有一个很好的方法来处理这个问题?我们实际上不需要“ajaxified”排序和分页。我们更愿意通过 ViewParams 处理所有事情,但这似乎不受 primefaces 的支持。

【问题讨论】:

【参考方案1】:

我也遇到了这个问题,我开发了一种可能会有所帮助的编码模式。它并不是一个真正的 PrimeFaces 东西(我也在使用它)——更多的是一种将书签链接与 JSF 2 一起使用的技术。

在标记中,我包含了页面的所有参数,如下所示:

        <f:metadata>
            <f:viewParam name="orderID" value="#bean.orderID" />
            <f:viewParam name="sortMode" value="#bean.sortMode" />
            <f:viewParam name="firstRecord" value="#bean.firstRecord" />
            <f:viewParam name="pageSize" value="#bean.pageSize" />
        </f:metadata>

这些值中的每一个都支持在支持 bean 中,因此,如果未设置它们,它们会生成一个合适的默认值。例如:

public int getPageSize() 
    if (pageSize < MIN_PAGE_SIZE) pageSize = DEF_PAGE_SIZE;
    if (pageSize > MAX_PAGE_SIZE) pageSize = DEF_PAGE_SIZE;
    return pageSize;

可以按如下方式生成指向该视图的链接:

现在您实现用户控件来更改这些值,并在每次更改时重新生成表。您仍然应该为此使用 AJAX——例如:

<p:spinner value=#bean.pageSize >
    <p:ajax update="tableID" />
</p:spinner>

在 setter 方法中,您必须触发表的重新生成,但这就是它的要点。我希望这会有所帮助。

更新:

要处理分页,您只需为首页、前一页、下一页等添加链接。链接将如下所示:

 <h:link  value="First Page" outcome="thisPage">
         <f:param name="orderID" value="#bean.orderID" />
         <f:param name="sortMode" value="#bean.sortMode" />
         <f:param name="firstRecord" value="0" />
         <f:param name="pageSize" value="#bean.pageSize" />
 </h:link>
 <h:link  value="Next Page" outcome="thisPage">
         <f:param name="orderID" value="#bean.orderID" />
         <f:param name="sortMode" value="#bean.sortMode" />
         <f:param name="firstRecord" value="#bean.nextRecord" />
         <f:param name="pageSize" value="#bean.pageSize" />
 </h:link>

等等。您需要在支持 bean 中实现属性来计算 firstRecord 参数应该是什么。

【讨论】:

thx,是的,我更喜欢将页面和排序参数作为视图参数。但我的问题更多是关于如何使用 primefaces 中的layz load dataable 使用这种方法处理分页和排序。 仍然 - 你如何告诉 primefaces 数据表中的分页器和排序按钮它们不应该执行 ajax 请求,而是使用这些参数调用新的页面请求?我看到的唯一解决方案是使用这样的排序和分页编写自己的数据表组件。但我真的很好奇我是否是第一个遇到这个问题的人。在我看来,这是应该由组件框架处理的功能。 @fischermatte 我只是不使用 Primefaces 分页器。只需将我为您编码的链接添加到您想要的任何位置并应用您想要的样式。我也不使用 Primefaces 拥有的 LazyDataModel。我认为这是浪费时间。相反,我只有一个基于 List 的属性。它将根据支持 bean 中的其他属性生成数据列表。 谢谢艾伦。不知道,当然我可以自己编写所有代码。但这感觉有点不对劲。出于这个原因,我使用了像 primefaces 这样的组件库。 很抱歉迟到了您的回答。目前我认为这是唯一合理的方法。但令我惊讶的是,在最近的 JSF 组件库(如 primefaces)中,ajax / 浏览器后退问题没有得到正确处理。

以上是关于具有分页和排序以及浏览器返回的 JSF 数据表的主要内容,如果未能解决你的问题,请参考以下文章

分页和排序问题

Spring Data Jpa: 分页和排序

Spring Data Jpa: 分页和排序

Spring Data 分页和排序 PagingAndSortingRepository的使用

具有自己数据库的微服务的聚集,排序,过滤和分页

使用具有 EnableCaching = true 的 ObjectDataSource 优化分页和排序