带有分页、排序和浏览器返回功能的JSF数据表



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

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

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

有人有一个很好的方法来处理这个问题吗?实际上,我们不需要"ajaxified"排序和分页。我们更喜欢通过ViewParams处理所有内容,但primefaces似乎不支持这一点。

我也遇到了这个问题,我开发了一种可能会有所帮助的编码模式。它实际上并不是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>

这些值中的每一个都在backingbean中进行备份,这样,如果没有设置它们,它们就会产生一个合适的默认值。例如:

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>

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

最新更新