日期:2014-05-16  浏览次数:20379 次

JSF2.0+Richfaces4.0自定义分页实现

之前项目中使用的是 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 {