首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

通用分頁工具類設計:封裝總頁數、當前頁、數據範圍計算邏輯

     編輯:關於JSP

分頁是Web列表頁標配。將「總記錄數→總頁數、當前頁→數據起止行號」的計算邏輯封裝為復用工具類,消除Controller/JSP中的重復算術代碼。本文提供PageUpDown類完整實現與使用指南。

工具類完整代碼(whw.function.PageUpDown)

package whw.function;

public class PageUpDown {
    private int currentPage;    // 當前頁
    private int totalPages;     // 總頁數
    private int totalRows;      // 總行數
    private int pageSize = 5;   // 每頁行數,默認5
    private int startRow;       // 當前頁起始行號(1-based)
    private int endRow;         // 當前頁結束行號

    /** 設置總行數,自動計算總頁數 */
    public void setTotalRows(int totalRows) {
        this.totalRows = totalRows;
        if (totalRows > 0 && pageSize > 0) {
            int pages = totalRows / pageSize;
            if (totalRows % pageSize > 0) pages++;
            totalPages = pages;
        }
    }

    /** 設置每頁行數 */
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getTotalPages() { return totalPages; }

    /** 首頁 */
    public void firstPage() {
        currentPage = 1;
        calcRowRange();
    }

    /** 尾頁 */
    public void lastPage() {
        currentPage = totalPages;
        calcRowRange();
    }

    /** 上一頁 */
    public void previousPage(int currentPage) {
        this.currentPage = (currentPage <= 1) ? 1 : currentPage - 1;
        calcRowRange();
    }

    /** 下一頁 */
    public void nextPage(int currentPage) {
        this.currentPage = (currentPage >= totalPages) ? totalPages : currentPage + 1;
        calcRowRange();
    }

    /** 跳轉指定頁 */
    public void gotoPage(int page) {
        if (page < 1) page = 1;
        if (page > totalPages) page = totalPages;
        this.currentPage = page;
        calcRowRange();
    }

    /** 核心:根據當前頁計算數據範圍 */
    private void calcRowRange() {
        startRow = (currentPage - 1) * pageSize + 1;
        endRow = currentPage * pageSize;
        if (endRow > totalRows) endRow = totalRows;
    }

    public int getStartRow() { return startRow; }
    public int getEndRow() { return endRow; }
    public int getCurrentPage() { return currentPage; }
}

使用流程

  1. DAO查詢總記錄數:int total = userDao.countAll();
  2. 實例化工具類並設置總行數:
    PageUpDown pager = new PageUpDown();
    pager.setTotalRows(total);
    pager.setPageSize(10); // 可選,默認5
  3. 獲取總頁數傳給前端:request.setAttribute("totalPages", pager.getTotalPages());
  4. 根據請求頁碼計算範圍:
    int pageNo = Integer.parseInt(request.getParameter("pageNo"));
    pager.gotoPage(pageNo);
  5. DAO分頁查詢:
    List<User> list = userDao.findByPage(pager.getStartRow(), pager.getEndRow());
  6. 頁面渲染列表與分頁導航(首頁/上頁/頁碼/下頁/尾頁)。

數據庫分頁SQL適配

數據庫分頁寫法參數映射
MySQLLIMIT ?, ?startRow-1, pageSize
Oracle 12c+OFFSET ? ROWS FETCH NEXT ? ROWS ONLYstartRow-1, pageSize
SQL Server 2012+OFFSET ? ROWS FETCH NEXT ? ROWS ONLYstartRow-1, pageSize
PostgreSQLLIMIT ? OFFSET ?pageSize, startRow-1
通用(游標)JDBC 2.0 ResultSet.TYPE_SCROLL_INSENSITIVErs.absolute(startRow) 循環pageSize次

擴展建議

  • 泛型化:PageResult<T>封裝List<T> data, long total, int pageNo, int pageSize,Controller直接返回JSON。
  • 前端組件化:Vue/React分頁組件接收total, pageSize, current屬性,發射change事件。
  • 性能優化:大偏移量LIMIT 1000000, 10極慢 → 改用WHERE id > lastId ORDER BY id LIMIT 10(游標分頁/Keyset Pagination)。
  • 緩存總數:總記錄數變化低頻,Redis緩存count(*)結果,定時/事件驅動刷新。

現代框架中的分頁抽象

  • Spring Data:Pageable pageable = PageRequest.of(pageNo-1, pageSize); Page<User> page = repo.findAll(pageable);
  • MyBatis-Plus:IPage<User> page = new Page<>(pageNo, pageSize); mapper.selectPage(page, null);
  • Hibernate:query.setFirstResult(startRow-1).setMaxResults(pageSize);

「一個工具類統一分頁算術」是早期JSP/Servlet時代的智慧結晶。現代框架雖內置更強大的分頁抽象,但startRow/endRow計算邏輯、邊界防呆、總頁數推導的核心思想始終相通。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved