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

时间:2012-03-16 23:13:53

标签: jsf-2 primefaces back-button

我们使用Primefaces数据表组件进行排序,分页和LazyDataModel以显示搜索结果。搜索页面的辅助bean为ViewScoped

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

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

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

1 个答案:

答案 0 :(得分: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 param应该是什么。