我有一个JSF应用程序,我正在转换为使用webservices而不是直接数据库查询。有一些非常长的列表,之前可以通过简单的SQL查询轻松返回。我想弄清楚如何使用JSF / Web服务实现分页。是否有一个良好的设计模式来进行分页Web服务?
如果重要的话,我目前正在使用JSF的Apache MyFaces参考实现和Tomahawk扩展(MyFaces开发团队在向Apache捐赠之前创建的一组JSF组件)。
答案 0 :(得分:2)
我喜欢Seam的Query对象:http://docs.jboss.com/seam/2.1.0.BETA1/reference/en-US/html_single/#d0e7527
它们基本上抽象了JSF可以轻松使用的Seam组件中的所有SQL / JPA。
如果您不想使用Seam和/或JPA,您可以实现类似的模式。
答案 1 :(得分:2)
Trinidad有一个支持分页的表组件,这可能会有所帮助。它并不理想,但与Seam一样运作良好,如Pete Muir的Backing Trinidad's dataTable with Seam博客文章所述。
如果找不到您喜欢的JSF组件,则需要编写自己的逻辑来为EJB-QL中的 limit 和 offset 设置参数(JPA)查询。
答案 2 :(得分:2)
这取决于您是要进行客户端分页还是服务器端分页。如果是服务器端,您的Web服务必须包含一些其他参数(例如“startFrom”和“pageSize”),这些参数将允许您指定要检索的数据的“页面”。您的服务可能还需要返回总结果大小,以便生成分页控件。
如果您认为付出太多努力,可以在您的支持bean中进行客户端分页(或者让组件为您执行此操作),但是如果您谈论的是数千个对象,则不建议这样做!
答案 3 :(得分:2)
我们使用RichFaces库Datatable:http://livedemo.exadel.com/richfaces-demo/richfaces/dataTable.jsf?tab=usage
这很简单,如果您还没有使用RichFaces,那么真的很容易与MyFaces集成。
答案 4 :(得分:1)
如果要立即从Web服务获取所有结果,并且不能将分页包含到实际的Web服务调用中,则可以尝试将项列表设置为托管bean上的属性。然后你可以将它连接到Tomahawk dataTable上的“value”属性:
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进行其他整洁的操作,例如排序和切换每行的详细信息,但这可以在您获得基本分页工作后实现。
希望有所帮助!