早期 JSP + MySQL 分頁經典寫法:使用 TYPE_SCROLL_INSENSITIVE 游標定位、手動計算總筆數/總頁數、前後頁連結產生。現代建議改用 LIMIT offset, size。
test、表 note(name VARCHAR)<%@ page contentType="text/html;charset=gb2312" import="java.sql.*" %>
<%
int pageSize = 2;
String strPage = request.getParameter("page");
int currentPage = (strPage == null) ? 1 : Integer.parseInt(strPage);
if (currentPage < 1) currentPage = 1;
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test");
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
// 1. 取得總筆數
ResultSet rsCount = stmt.executeQuery("SELECT COUNT(*) FROM note");
rsCount.next();
int totalRows = rsCount.getInt(1);
int totalPages = (totalRows + pageSize - 1) / pageSize;
if (currentPage > totalPages) currentPage = totalPages;
// 2. 定位到起始列 (Scrollable ResultSet 方式)
ResultSet rs = stmt.executeQuery("SELECT name FROM note");
rs.absolute((currentPage - 1) * pageSize + 1);
// 3. 輸出當頁資料
for (int i = 0; i < pageSize && !rs.isAfterLast(); i++) {
out.println(rs.getString("name") + "<br>");
rs.next();
}
// 4. 產生分頁連結
for (int p = 1; p <= totalPages; p++) {
if (p == currentPage) out.print("[" + p + "] ");
else out.print("<a href='?page=" + p + "'>" + p + "</a> ");
}
rs.close(); rsCount.close(); stmt.close(); conn.close();
%>
| 技術 | 說明 |
|---|---|
TYPE_SCROLL_INSENSITIVE | 可隨意移動游標 (absolute()/relative()),不反映後續資料變更 |
absolute(n) | 移動到第 n 列 (1-based) |
isAfterLast() | 判斷是否超過最後一列 |
| 手動 COUNT(*) | 必須額外查詢總筆數 |