前置準備
- ODBC 系統 DSN:`Test_DB` (SQL Server 7)
- 資料表:`guestbook (name, email, body)`
- 帳號:`sa` / 密碼空白
核心 JSP 代碼(含分頁邏輯)
<%
// 參數接收
String strPage = request.getParameter("page");
int intPage = (strPage == null) ? 1 : Integer.parseInt(strPage);
int intPageSize = 5;
// 連線與查詢總筆數
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection("jdbc:odbc:Test_DB", "sa", "");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM guestbook");
rs.next();
int intRowCount = rs.getInt(1);
int intPageCount = (int) Math.ceil((double) intRowCount / intPageSize);
if (intPage > intPageCount) intPage = intPageCount;
// 取得當頁資料(使用捲動游標定位)
rs = stmt.executeQuery("SELECT name, email, body FROM guestbook");
int start = (intPage - 1) * intPageSize;
for (int i = 0; i < start && rs.next(); i++); // 定位到起始行
// 顯示資料
int displayed = 0;
while (displayed < intPageSize && rs.next()) {
%>
姓名:<%= rs.getString("name") %><br>
郵件:<%= rs.getString("email") %><br>
內容:<%= rs.getString("body") %><hr>
<%
displayed++;
}
%>
第 <%= intPage %> 頁 / 共 <%= intPageCount %> 頁<br>
<%
if (intPage < intPageCount) {
%> <a href="test.jsp?page=<%= intPage+1 %>">下一頁</a> <%
}
if (intPage > 1) {
%> <a href="test.jsp?page=<%= intPage-1 %>">上一頁</a> <%
}
<%
rs.close(); stmt.close(); conn.close();
%>
關鍵技術點
- JDBC-ODBC 橋接器:`sun.jdbc.odbc.JdbcOdbcDriver`(JDK 8 後移除,現代專案請用原生 JDBC 驅動)。
- 捲動游標定位:`TYPE_SCROLL_SENSITIVE` 允許 `rs.next()` 逐行跳過至目標頁起始行。
- 分頁參數傳遞:QueryString `page` 參數控制頁碼。
- 資源釋放:頁面結尾顯式關閉 `ResultSet`、`Statement`、`Connection`。
部署與測試
- 儲存為 `test.jsp` 置於應用伺服器部署目錄(Tomcat `webapps/ROOT`、Resin `doc` 等)。
- 瀏覽 `https://localhost:8080/test.jsp` 驗證分頁功能。
現代化改良建議
- 改用資料庫原生分頁(SQL Server `OFFSET/FETCH`、MySQL `LIMIT`、Oracle `ROWNUM`)。
- 採用連線池(HikariCP/Druid)替代 `DriverManager`。
- 引入 JSTL/EL 移除 Scriptlet,分離呈現邏輯。
- 加入參數驗證(頁碼邊界、SQL 注入防護)。