我有一个JSF应用程序,我将其转换为使用 Web 服务,而不是直接使用数据库查询。以前可以通过简单的 SQL 查询轻松返回一些非常长的列表。我想弄清楚如何使用 JSF/Web 服务实现分页。是否有用于分页 Web 服务的良好设计模式?
如果这很重要,我目前正在使用带有 Tomahawk 扩展(MyFaces 开发团队在捐赠给 Apache 之前创建的一组 JSF 组件)的 JSF的Apache MyFaces参考实现。
我有一个JSF应用程序,我将其转换为使用 Web 服务,而不是直接使用数据库查询。以前可以通过简单的 SQL 查询轻松返回一些非常长的列表。我想弄清楚如何使用 JSF/Web 服务实现分页。是否有用于分页 Web 服务的良好设计模式?
如果这很重要,我目前正在使用带有 Tomahawk 扩展(MyFaces 开发团队在捐赠给 Apache 之前创建的一组 JSF 组件)的 JSF的Apache MyFaces参考实现。
这取决于您是要进行客户端还是服务器端分页。如果是服务器端,您的 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) 查询中的限制和偏移参数。
我们使用了 RichFaces 库 Datatable:http ://livedemo.exadel.com/richfaces-demo/richfaces/dataTable.jsf?tab=usage
这很简单,如果您还没有使用 RichFaces,那么与 MyFaces 集成非常容易。
如果您一次从 Web 服务返回所有结果并且无法将分页包含到实际的 Web 服务调用中,您可以尝试将项目列表设置为托管 bean 上的属性。然后,您可以将其连接到 Tomahawk 数据表上的“值”属性:
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 执行其他一些巧妙的操作,例如对每一行进行排序和切换详细信息,但是一旦您使基本分页工作正常,就可以实现这些操作。
希望有帮助!