日期:2014-05-16 浏览次数:20466 次
之前项目中使用的是 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 {