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