一個好用的java分頁算法,代碼如下,只需要分頁參數繼承Pageable類就可以很方便分頁了
package cn.com.base.common.pagination; /** * 分頁基類 * * @author cary * @since 2013-1-23 下午3:03:32 */ public class Pageable implements java.io.Serializable { private static final long serialVersionUID = 1L; /** * 每頁默認的項數(10) */ public static final int DEFAULT_ITEMS_PER_PAGE = 10; /** * 滑動窗口默認的大小(7) */ public static final int DEFAULT_SLIDER_SIZE = 7; /** * 表示項數未知(<code>Integer.MAX_VALUE</code>) */ public static final int UNKNOWN_ITEMS = Integer.MAX_VALUE; /** * 狀態量 */ private int page; // 當前頁碼 private int items; // 總共項數 private int itemsPerPage; // 每頁項數。 private int startRow; // 開始條數 private int endRow;// 結束條數 /** * 創建一個分頁器,初始項數為無限大<code>UNKNOWN_ITEMS</code>,默認每頁顯示<code>10</code>項 */ public Pageable() { this(0); } /** * 創建一個分頁器,初始項數為無限大<code>UNKNOWN_ITEMS</code>,指定每頁項數 * * @param itemsPerPage 每頁項數。 */ public Pageable(int itemsPerPage) { this(itemsPerPage, UNKNOWN_ITEMS); } /** * 創建一個分頁器,初始項數為無限大<code>UNKNOWN_ITEMS</code>,指定每頁項數 * * @param itemsPerPage 每頁項數 * @param items 總項數 */ public Pageable(int itemsPerPage, int items) { this.items = (items >= 0) ? items : 0; this.itemsPerPage = (itemsPerPage > 0) ? itemsPerPage : DEFAULT_ITEMS_PER_PAGE; this.page = calcPage(0); } /** * 取得總頁數。 * * @return 總頁數 */ public int getPages() { if (items <= 0) { return 1; } return (int) Math.ceil((double) items / itemsPerPage); } /** * 取得當前頁。 * * @return 當前頁 */ public int getPage() { return page; } /** * 設置並取得當前頁 * * @param page 當前頁 * @return 設置后的當前頁 */ public int setPage(int page) { return (this.page = calcPage(page)); } /** * 取得總項數。 * * @return 總項數 */ public int getItems() { return items; } /** * 設置並取得總項數。如果指定的總項數小於0,則被看作0 * * @param items總項數 * @return 設置以后的總項數 */ public int setItems(int items) { this.items = (items >= 0) ? items : 0; setPage(page); return this.items; } /** * 取得每頁項數。 * * @return 每頁項數 */ public int getItemsPerPage() { return itemsPerPage; } /** * 設置並取得每頁項數。如果指定的每頁項數小於等於0,則使用默認值<code>DEFAULT_ITEMS_PER_PAGE</code> * 並調整當前頁使之在改變每頁項數前后顯示相同的項 * * @param itemsPerPage 每頁項數 * @return 設置后的每頁項數 */ public int setItemsPerPage(int itemsPerPage) { int tmp = this.itemsPerPage; this.itemsPerPage = (itemsPerPage > 0) ? itemsPerPage : DEFAULT_ITEMS_PER_PAGE; if (page > 0) { setPage((int) (((double) (page - 1) * tmp) / this.itemsPerPage) + 1); } return this.itemsPerPage; } /** * 取得當前頁的長度,即當前頁的實際項數。相當於 <code>endIndex() - beginIndex() + 1</code> * * @return 當前頁的長度 */ public int getLength() { if (page > 0) { return Math.min(itemsPerPage * page, items) - (itemsPerPage * (page - 1)); } else { return 0; } } /** * 取得首頁頁碼。 * * @return 首頁頁碼 */ public int getFirstPage() { return calcPage(1); } /** * 取得末頁頁碼。 * * @return 末頁頁碼 */ public int getLastPage() { return calcPage(getPages()); } /** * 取得前一頁頁碼。 * * @return 前一頁頁碼 */ public int getPreviousPage() { return calcPage(page - 1); } /** * 取得前n頁頁碼 * * @param n 前n頁 * @return 前n頁頁碼 */ public int getPreviousPage(int n) { return calcPage(page - n); } /** * 取得后一頁頁碼。 * * @return 后一頁頁碼 */ public int getNextPage() { return calcPage(page + 1); } /** * 取得后n頁頁碼。 * * @param n 后n面 * @return 后n頁頁碼 */ public int getNextPage(int n) { return calcPage(page + n); } /** * 判斷指定頁碼是否被禁止,也就是說指定頁碼超出了范圍或等於當前頁碼。 * * @param page 頁碼 * @return boolean 是否為禁止的頁碼 */ public boolean isDisabledPage(int page) { return ((page < 1) || (page > getPages()) || (page == this.page)); } /** * 計算頁數,但不改變當前頁。 * * @param page 頁碼 * @return 返回正確的頁碼(保證不會出邊界) */ protected int calcPage(int page) { int pages = getPages(); if (pages > 0) { return (page < 1) ? 1 : ((page > pages) ? pages : page); } return 0; } /** * 創建復本。 * * @return 復本 */ public Object clone() { try { return super.clone(); } catch (java.lang.CloneNotSupportedException e) { return null; // 不可能發生 } } /** * @param startRow the startRow to set */ public void setStartRow(int startRow) { this.startRow = startRow; } /** * @param endRow the endRow to set */ public void setEndRow(int endRow) { this.endRow = endRow; } /** * @return the startRow */ public int getStartRow() { if (page > 0) { startRow = (itemsPerPage * (page - 1)) + 1; } else { startRow = 0; } return startRow; } /** * @return the endRow */ public int getEndRow() { if (page > 0) { endRow = Math.min(itemsPerPage * page, items); } else { endRow = 0; } return endRow; } }