java實現的一個分頁算法


一個好用的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;
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM