日期:2014-05-16 浏览次数:20379 次
之前项目中使用的是 richfaces自带的分页组件开发,但是性能上存在很大问题,所以需要使用数据库分页,这篇文章的主要内容是从网上借鉴过来的,但是网上大多是基于JSF1.2+Rf3.2的基础上进行分页的,我把代码稍微改了下,发现可以在JSF2.0+RF4.0的基础上使用!
?
dao层
?
//自定义分页 public int datasetSize(){ try { String queryString = "select count(*) from Book"; Query query = em.createQuery(queryString); return Integer.parseInt(query.getSingleResult() .toString()); } catch (RuntimeException re) { throw re; } } @SuppressWarnings("unchecked") public List<GoodsType> findAll(int startRow,int pageSize) { try { final String queryString = "select model from Book model"; Query query = em.createQuery(queryString); query.setFirstResult(startRow); query.setMaxResults(pageSize); return query.getResultList(); } catch (RuntimeException re) { throw re; } }
?
DataPage.java?
?
package com.page; import java.util.List; public class DataPage { /** * 将需要的页的数据封装到一个DataPage中去, 这个类表示了我们需要的一页的数据,<br> * 里面包含有三个元素:datasetSize,startRow,和一个用于表示具体数据的List。<br> * datasetSize表示了这个记录集的总条数,查询数据的时候,使用同样的条件取count即可,<br> * startRow表示该页的起始行在数据库中所有记录集中的位置 */ private int datasetSize; private int startRow; private List data; /** * * @param datasetSize * 数据集大小 * @param startRow * 起始行 * @param data * 数据list */ public DataPage(int datasetSize, int startRow, List data) { this.datasetSize = datasetSize; this.startRow = startRow; this.data = data; } /** * * @return */ public int getDatasetSize() { return datasetSize; } public int getStartRow() { return startRow; } /** * * @return 已填充好的数据集 */ public List getData() { return data; } }
?
PageListBaseBean.java
?
package com.page; /** * TODO 带分页功能的基类 * * @author <a href="mailto:tianlu@jsecode.com">TianLu</a> * @version $Rev$ <br> * $Id$ */ public abstract class PageListBaseBean { /** * 当前页码,跟dataSroller的page属性绑定 */ protected int scrollerPage = 1; /** * 当前页面大小 */ protected int pageSize = 10; /** * 默认数据模型,如果你有多个数据集需要分页,请自定义PagedListDataModel和相应的getDataModel方法 */ protected PageListDataModel defaultDataModel; public int getScrollerPage() { return scrollerPage; } public void setScrollerPage(int scrollerPage) { this.scrollerPage = scrollerPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public abstract PageListDataModel getDefaultDataModel(); }
?
PageListDataModel.java?
?
package com.page; import java.io.Serializable; import javax.faces.model.DataModel; public abstract class PageListDataModel extends DataModel implements Serializable { int pageSize; int rowIndex; DataPage page; /** * 创建一个datamodel显示数据,每一页指定的行数。 */ public PageListDataModel(int pageSize) { super(); this.pageSize = pageSize; this.rowIndex = -1; this.page = null; } /** * 数据是通过一个回调fetchData方法获取,而不是明确指定一个列表 */ public void setWrappedData(Object o) { if (o instanceof DataPage) { this.page = (DataPage) o; } else {