jsf集成spring_Spring和JSF集成:分页

jsf集成spring

使用大型数据集时,通常需要以分页格式显示数据。 分页是一个有趣的问题,因为它倾向于跨越应用程序的所有层,从视图层通过应用程序服务一直到对数据库的原始调用。
在获取分页数据时,有一些非常好的解决方案。 如果您使用的是JPA,则您可能熟悉javax.persistence.Query可用的setFirstResult()setMaxResult()方法。 更好的是Spring Data JPA项目,该项目提供org.springframework.data.domain.Pageableorg.springframework.data.domain.Page接口,可直接在您的存储库中使用。
使用JSF,还有一些记录良好的显示和获取分页数据的方法。 确切的解决方案将取决于您使用的组件套件,但是大多数解决方案都基于创建自定义javax.faces.model.DataModel实现。 例如MyFaces 在其Wiki上建议RichFaces博客上发布了有关此问题的信息PrimeFaces提供了延迟加载数据表
最近,我一直在尝试开发一些东西来减轻JSF开发人员的负担,并消除了创建自定义DataModel和暴露它们的支持bean的需要。 基本思想是,JSF组件将使用EL表达式代表您创建延迟加载的DataModel,以根据需要获取数据。
这是一个例子:
<s:pagedData 
  var="myDataModel" 
  value="#{userRepository.findByLastName(
    backingBean.lastName, pageRequest.offset, pageRequest.pageSize)}"
  pageSize="20" />
这将创建一个myDataModel变量,该变量将通过调用userRepository.findByLastName()一次获取20行数据。 滚动DataModel时,将多次调用EL表达式。
(我假设您使用的是EL 2.2,如果您使用的是旧服务器(例如Tomcat 6),则可能需要安装更新的el-impl.jar 。)
每次将EL表达式称为pageRequest变量时,都将使其可用。 此变量提供访问以下上下文信息的权限,这些上下文信息在获取数据页时可能需要:
pageNumber 要显示的页码
页面大小 请求的页面大小
抵消 偏移量(第一个结果)
sortColumn 用于对数据进行排序的列
升序 如果排序是升序还是降序
过滤器 要应用的过滤条件图
在上面的示例中创建的DataModel的一个问题是总行数未知。 为了获得此信息,我们需要提供一个附加表达式:
<s:pagedData
  value="#{userRepository.findByLastName(
    backingBean.lastName,pageRequest.offset, pageRequest.pageSize)}"
  rowCount="#{userRepository.countByLastName(backingBean.lastName)}" />
上面的示例还删除了varpageSize属性,这将使用默认页面大小10并使用变量名pagedData
如果您使用过Spring Data,您可能已经注意到pageRequest变量与org.springframework.data.domain.Pageable接口的相似pageRequest 。 实际上,只要Spring Data在您的类路径上, pageRequest就可以pageRequestPageable 。 此外,该组件可以理解org.springframework.data.domain.Page对象,因此您不再需要rowCount表达式。
这是一个示例,该示例调用spring数据存储库并使用MyFaces Tomahawk组件显示数据。 此示例还允许您通过单击列标题来对数据进行排序:
<s:pagedData value="#{userRepository.findByLastName(backingBean.lastName, pageRequest)}" />
<t:dataTable value="#{pagedData}" rows="#{pagedData.pageSize}"
    sortColumn="#{pagedData.sortColumn}" sortAscending="#{pagedData.sortAscending}" var="user">
  <t:column>
    <f:facet name="header">
      <t:commandSortHeader columnName="name">
        <h:outputText value="User Name" />
      </t:commandSortHeader>
    </f:facet>
    <h:outputText value="#{user.name}" />
  </t:column>
  <f:facet name="footer">
    <t:dataScroller paginator="true" paginatorMaxPages="9" />
  </f:facet>
</t:dataTable>
我们的最后一个诀窍是确保使用PrimeFaces时创建的DataModel与org.primefaces.model.LazyDataModel兼容。 这里是与上面相同的示例,但是使用了PrimeFaces组件:
<s:pagedData value="#{userRepository.findByLastName(backingBean.lastName, pageRequest)}" />
<p:dataTable value="#{pagedData}" rows="#{pagedData.pageSize}" 
     paginator="true" lazy="true" var="user">
  <p:column headerText="User Name" sortBy="#{user.name}">
    <h:outputText value="#{user.name}" />
  </p:column>
</p:dataTable>
如果要查看任何代码,可以在GitHub找到 (查看org.springframework.springfaces.page.uiorg.springframework.springfaces.model软件包)。 我也有一个显示页面标记的基本示例应用程序。 与往常一样,此代码是一个不断变化的目标,因此您在运行演示时可能会遇到一些问题。
参考: 集成Spring和JavaServer Faces: Phil Webb博客博客中我们的JCG合作伙伴 Phillip Webb的分页

翻译自: https://www.javacodegeeks.com/2012/05/spring-jsf-integration-pagination.html

jsf集成spring

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值