技术开发 频道

通用分页实现及其OO设计探讨



    2. 分页抽像实现类,实现关键的算法

    AbstractViewPage.java
/** * 分页默认抽象实现 * 初始时,分页类有下列默认值: * 分页大小为-1,为不分页; * 总页数为1页 * 当前页为第一页 * 总记录数为0条 * 当前页数据列表为没有任何记录的列表 * @author ex_yuanguangdong * */ public abstract class AbstractViewPage implements ViewPage { //----------------------------------------- //私有静态常量 //----------------------------------------- private static final int DEFAULT_PAGE_INDEX = 1; private static final int DEFALT_PAGE_COUNT = 1; private static final int DEFAULT_PAGE_SIZE = -1; private static final int DEFAULT_ROWS = 0; //----------------------------------------- //私有成员变量 //----------------------------------------- /**当前页索引号**/ private int pageIndex = DEFAULT_PAGE_INDEX; /**总页数**/ private int pageCount =DEFALT_PAGE_COUNT; /**分页大小**/ private int pageSize = DEFAULT_PAGE_SIZE ; /**数据总记录数**/ private int rows = DEFAULT_ROWS; //------------------------------------------ //本地成员变量getter,setter方法 //------------------------------------------ /** * 设置新页号,只有大于等于1而且小于等于总页数并且不为当前页时,才允许设置 * @param pageIndex The pageIndex to set. */ private void setPageIndex(int newPageIndex) { if( newPageIndex >= this.DEFAULT_PAGE_INDEX && newPageIndex
<= this.getPageCount() && newPageIndex != this.pageIndex) { this.pageIndex = newPageIndex; } }
/** * @return Returns the rows. */ private int getRows() { return rows; } /** * @param rows The rows to set. */ private void setRows(int rows) { this.rows = rows; } /** * @param pageCount The pageCount to set. */ private void setPageCount(int pageCount) { this.pageCount = pageCount; } //-------------------------------------- //实现Page接口方法 //-------------------------------------- /** * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#getPageData() */ public List getPageData() { List pageList =null; //获得当前页数据 pageList = this.pageList(this.getPageFirstRecord(), this.getPageRows()); //保证不返回null if(pageList == null) { pageList =new ArrayList(); } return pageList; } /** * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#getPageIndex() */ public int getPageIndex() { return this.pageIndex; } /** * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#isFirstPage() */ public boolean isFirstPage() { return this.DEFAULT_PAGE_INDEX ==this.pageIndex; } /** * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#isLastPage() */ public boolean isLastPage() { //当前页索引为总页数时为最后一页 return this.pageIndex == this.pageCount; } /** * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#getHashNextPage() */ public boolean getHashNextPage() { //当前页索引号小于总页数 return this.pageIndex < this.pageCount ; } /** * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#getHashPreviousPage() */ public boolean getHashPreviousPage() { //当前页索引号大于默认的初始页号,这里为1 return this.pageIndex > this.DEFAULT_PAGE_INDEX ; } /** * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#getPageCount() */ public int getPageCount() { return this.pageCount; } /** * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#getPageSize() */ public int getPageSize() { return this.pageSize; } /** * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#getPageRows() */ public int getPageRows() { //当页面大小为-1 时,返回总记录数 if(this.DEFAULT_PAGE_SIZE == this.pageSize ) { return this.rows; } //不为最后一页时,返回pageSize if(!this.isLastPage()) { return this.pageSize; } //最后一页时 return this.rows - (this.pageSize * (this.pageCount -1)); } /** * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#getPageFirstRecord() */ public int getPageFirstRecord() { //页大小为-1 时 if(this.DEFAULT_PAGE_SIZE== this.pageSize ) { return 0; } return (this.pageIndex -1)* this.pageSize; } /** * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#getPageLastRecord() */ public int getPageLastRecord() { //页大小为-1时,返回总记录数 if(this.DEFAULT_PAGE_SIZE == this.pageSize) { return this.rows; } return this.getPageFirstRecord() + this.getPageRows() ; } /** * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#gotoFirstPage() */ public void gotoFirstPage() { this.gotoPage(this.DEFAULT_PAGE_INDEX); } /** * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#gotoLastPage() */ public void gotoLastPage() { this.gotoPage(this.getPageCount()); } /** * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#gotoPreviousPage() */ public void gotoPreviousPage() { this.gotoPage(this.getPageIndex() -1); } /** * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#gotoNextPage() */ public void gotoNextPage() { this.gotoPage(this.getPageIndex() + 1); } /** * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#gotoPage(int) */ public void gotoPage(int newPageIndex) { if( newPageIndex >= this.DEFAULT_PAGE_INDEX && newPageIndex
<= this.getPageCount() ) { this.setPageIndex(newPageIndex); } }
/** * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#setPageSize(int) */ public void setPageSize(int size) { if(size < 1) { size = 1; } this.pageSize = size; //进行初始化 this.doInit(); } //----------------------------------- //辅助方法 //----------------------------------- /** * 分页初始化方法,为了保证总是能正确的初始化,所以声明为final ,为了让子类可以调用声明为protected * */ protected final void doInit() { int rows = 0; //获得总记录数 rows= totalRows(); //设置总记录数 this.setRows(rows); //设置新的总页数 //计算并设置总页数 int pages = calculatePageCount(); this.setPageCount(pages); //转到第一页 this.gotoPage(this.DEFAULT_PAGE_INDEX); onInit(); } /** * 记算总页数 * @return 总页数 */ private int calculatePageCount() { //总记录数为0条,则返回的总页数为1 if(this.getRows() == 0) { return this.DEFALT_PAGE_COUNT; } //如果页面大小为-1,则返回的总页数为1 if(this.DEFAULT_PAGE_SIZE == this.getPageSize() ) { return this.DEFALT_PAGE_COUNT; } return this.getRows() / this.getPageSize() + ( this.getRows()
% this.getPageSize() ==0 ? 0 :1); }
/** * 获得总记录数,调用queryTotalRows(),将异常封装为non-checked 异常 * @return 总记录数 * @throws ApplicationRuntimeException */ private int totalRows() throws ApplicationRuntimeException{ try{ return queryTotalRows(); } catch(Exception ex){ throw new ApplicationRuntimeException(ex); } } /** * 获得当前页数据,调用queryPageList()方法,将异常封装为non-checked异常 * @param startRow 开始记录号 * @param rowCount 记录总数 * @return 当前页数据 * @throws ApplicationRuntimeException */ private List pageList(int startRow, int rowCount) throws ApplicationRuntimeException{ try{ return queryPageList(startRow, rowCount); }catch(Exception ex){ throw new ApplicationRuntimeException(ex); } } //----------------------------------------- //子类实现的方法 //----------------------------------------- /** * 初始化附加方法,由子类扩展 */ protected void onInit() { } /** * 查询获得总记录数,由子类具体实现 * @return 总记录数 * @throws Exception */ protected abstract int queryTotalRows() throws Exception; /** * 查询当前页数据,从startRow 开始的rowCount条记录 * @param startRow 开始记录号 * @param rowCount 记录总数 * @return 当前页数据 * @throws Exception */ protected abstract List queryPageList(int startRow, int rowCount) throws Exception; }
0
相关文章