我们使用具有排序、分页和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参数应该是什么。