我们如何在JavaServer Faces中进行分页列表?
我有一个要转换为使用Web服务而不是直接进行数据库查询的JSF应用程序。有一些非常长的列表,以前可以通过简单的SQL查询轻松返回。我想弄清楚如何使用JSF / Web服务实现分页。是否有进行分页Web服务的良好设计模式?
如果重要的话,我目前正在使用带有Tomahawk扩展(由MyFaces开发团队在捐赠给Apache之前创建的一组JSF组件)的JSF的Apache MyFaces参考实现。
解决方案
回答
我喜欢Seam的查询对象:http://docs.jboss.com/seam/2.1.0.BETA1/reference/en-US/html_single/#d0e7527
他们基本上将JSF可以轻松使用的Seam组件中的所有SQL / JPA抽象化。
如果我们不想使用Seam和/或者JPA,则可以实现类似的模式。
回答
特立尼达有一个支持分页的表组件,这可能会有所帮助。这不是理想的方法,但是可以与Seam很好地配合使用,如Pete Muir在Backing Trinidad的dataTable with Seam博客中所述。
如果找不到喜欢的JSF组件,则需要编写自己的逻辑来设置EJB-QL(JPA)查询中的限制和偏移量参数。
回答
这取决于我们是否要进行客户端分页或者服务器端分页。如果是服务器端,则Web服务将必须包含几个其他参数(例如" startFrom"和" pageSize"),这些参数可让我们指定要检索数据的"页面"。服务可能还需要返回总结果大小,以便我们可以生成分页控件。
如果我们决定付出太多的努力,则可以在后备bean中进行客户端分页(或者让组件为我们完成),但是,如果我们要谈论数千个对象,则不建议这样做!
回答
我们使用了RichFaces库数据表:http://livedemo.exadel.com/richfaces-demo/richfaces/dataTable.jsf?tab=usage
这非常简单,如果我们还没有使用RichFaces,则与MyFaces集成起来真的很容易。
回答
如果我们要一次从Web服务获取所有结果,并且不能在实际的Web服务调用中包含分页,则可以尝试将项目列表设置为托管Bean上的属性。然后,我们可以将其连接到"战斧"数据表的"值"属性:
http://myfaces.apache.org/tomahawk-project/tomahawk/tagdoc/t_dataTable.html
然后我们可以使用Tomahawk dataScroller在该属性中存储的项目列表上进行分页。这是该组件的参考,它与dataTable组件配合良好:
http://myfaces.apache.org/tomahawk-project/tomahawk/tagdoc/t_dataScroller.html
我们可以将其包括在dataTable的页眉/页脚刻面中,也可以作为单独的组合(我们需要在dataScroller的'for'属性中指定dataTable的ID。
我们还可以使用dataTable进行其他整洁的工作,例如对每一行进行排序和切换详细信息,但是只要基本的分页工作就可以实现。
希望对我们有所帮助!