分頁邏輯說明
count:總記錄數
page:用戶請求頁碼(可為負數表示大頁跳轉)
- 每頁 15 筆,每 10 頁為一大頁
核心 JSP 代碼片段
<%
int i = count / 15; // 總頁數
int j = i / 10; // 總大頁數
int StartPage;
if (Page < 0) Page = 0 - Page * 10; // 負數轉大頁跳轉
StartPage = Page / 10;
out.print("[共有" + i + "頁]");
if (StartPage > 0) out.print("|前10頁");
for (int k = 0; k < 10; k++) {
int p = StartPage * 10 + k;
if (p > i) break;
if (p == Page)
out.print("|第" + (p+1) + "頁"); // 當前頁高亮
else
out.print("|第" + (p+1) + "頁");
}
if (StartPage < j) out.print("|後10頁");
out.print("|");
%>
完整應用架構建議
1. 資料查詢層(DAO)
public List findByPage(int offset, int pageSize) {
String sql = "SELECT * FROM table LIMIT ?, ?";
// 使用 PreparedStatement 防注入
return jdbcTemplate.query(sql, new Object[]{offset, pageSize}, rowMapper);
}
public int getTotalCount() {
return jdbcTemplate.queryForObject("SELECT COUNT(*) FROM table", Integer.class);
}
2. 控制層
int page = Integer.parseInt(request.getParameter("page"));
int pageSize = 15;
int offset = (page - 1) * pageSize;
List list = dao.findByPage(offset, pageSize);
int total = dao.getTotalCount();
request.setAttribute("list", list);
request.setAttribute("count", total);
request.setAttribute("page", page);
3. 視圖層
- 使用 JSTL
<c:forEach> 迴圈顯示資料
- 分頁導航元件化,支援首頁/尾頁/上一頁/下一頁/頁碼跳轉
- 加入每頁筆數選擇器(10/15/20/50)
現代化改進方向
- 後端改用 Spring Boot + MyBatis/JPA
- 前端採用 Vue/React + ElementUI/Ant Design 分頁元件
- 大數據量採用游標分頁
WHERE id > last_id LIMIT n 避免 OFFSET 深分頁效能問題
- 加入 Redis 快取熱門頁面