Servlet實作資料分頁顯示
1.資料分頁的應用
在很多情況下,Web網頁的顯示結果都很多,不可能在一個頁面完全顯示出來,這時候就需要用到資料分頁
比如我們很熟悉的Google搜尋結果:
那麼怎麼通過Servlet實作這個功能呢?
2.Servlet連接配接資料庫
首先我們的資料是存放在資料庫中,那麼就需要Servlet去連接配接資料庫,進而擷取資料。
Servlet連接配接資料庫的步驟同JavaSE連接配接資料庫的操作一樣
其實Servlet本身也就是Java
。
首先需要準備Java連接配接資料庫的相關jar包
不同的資料庫有不同的jar包,我使用的是SQLServer 2008 R2版本
,然後将jar包引入項目。
接下來就是正常的5個步驟了:
- 加載驅動
- 得到連結
- 建立PrepareStatement
- 執行操作
- 根據結果做相應的處理
比如,以登入驗證為例,下述代碼是一個簡單的使用者登入驗證執行個體(要注意這裡省去了異常處理的過程):
// 資料庫連結
String connectionUrl = "jdbc:sqlserver://localhost:1433;DatabaseName=Manager;";
Connection con = null;
ResultSet rs = null;
PreparedStatement ps = null;
// 1.加載驅動
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
// 2.得到連結
con = DriverManager.getConnection(connectionUrl,"***","***");
// 3.建立PrepareStatement
ps = con.prepareStatement("select * from users where id=? and passwd=?");
// 給?指派
ps.setObject(, id);
ps.setObject(, password);
// 4.執行操作
rs = ps.executeQuery();
// 5.根據結果做處理
if (rs.next()) {
//如果進入到這裡,則說明該使用者合法,執行跳轉
// 如果能夠使用請求轉發就不使用請求重定向,因為請求轉發節省了網絡開銷,效率高
request.setAttribute("id", id);
request.getRequestDispatcher("/MainFrame").forward(request, response);
}else{
// 使用者不合法
request.setAttribute("error", "使用者ID或者密碼有誤!");
request.getRequestDispatcher("/LoginServlet").forward(request, response);
}
3.Servlet實作資料分頁
3.1 資料庫中的分頁查詢
首先我們要知道資料庫中的分頁查詢文法,當然不同的資料庫文法都不一樣。
現在比如我們建立的使用者表如下所示,并插入資料:
create table users(
id int primary key,
username varchar() not null,
email varchar() not null,
grade int default ,
passwd varchar() not null
)
insert into users values(,'Gavin100','[email protected]',,'123')
insert into users values(,'Gavin101','[email protected]',,'123')
insert into users values(,'Gavin102','[email protected]',,'123')
...
假設我們要查詢按照id進行排序的第4行到第6行資料,則sql語句應該這樣寫:
查詢結果是這樣的:
num | id | username | grade | passwd | |
---|---|---|---|---|---|
4 | 103 | Gavin103 | [email protected] | 1 | 123 |
5 | 104 | Gavin104 | [email protected] | 1 | 123 |
6 | 105 | Gavin105 | [email protected] | 1 | 123 |
這裡最重要的是
ROW_NUMBER() over
函數的使用。
3.2 Servlet中實作分頁查詢
(1) 首先要實作分頁,我們需要在程式中定義4個相關的變量:
- pageNow:表示要顯示第幾頁,該變量是由使用者來決定的,是以它是變化的
- pageSize:表示每一頁顯示幾條記錄,由程式決定或者使用者自定義
- pageCount:表示總共有多少頁,該變量由程式計算出來
- rowCount:表示總共有多少條記錄,該變量由程式查詢資料庫得出
這裡如何确定pageCount呢?—>有三種方法,難易不同:
(1)最好了解的
if...else...
語句:
if(rowCount % pageSize == ){
pageCount = rowCount/pageSize
}else{
pageCount = rowCount/pageSize +
}
(2)将
if...else...
語句改成三目運算,則上面的代碼等價于這樣一句話:
pageCount = rowCount%pageSize==?rowCount/pageSize: rowCount/pageSize+
(3)最簡單的算法,要了解:
pageCount = (rowCount-)/pageSize + ;
(2) 程式實作
下述代碼詳細解釋了如何實作分頁,其實無非是從資料庫中查詢出對應的資料,然後循環顯示在頁面上。
要注意的是,代碼隻解釋思路,未考慮設計模式的問題,也省略了一些無關代碼和布局用到的css代碼。
// 三個變量先初始化
int pageSize = ;// 指定每一頁顯示3條記錄
int pageCount = ;// 總共的頁數,該變量是計算出來的
int rowCount = ;// 總共有多少條記錄,該變量需要讀取資料庫得到
// 定義第四個變量,即目前要顯示的頁數,初始化為1
int pageNow = ;
// 這個目前頁是使用者決定的,是以由使用者請求參數來确定
// 這個參數是下文中<a>連結中的href傳遞過來的,形如:/UserManager/ManageUsers?pageNow=xx
String temp_pageNow = request.getParameter("pageNow");
if (temp_pageNow != null) {
pageNow = Integer.parseInt(temp_pageNow);
}
//下面要連接配接資料庫讀取資料了
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
con = DriverManager.getConnection(connectionUrl, "**", "*****");
// 算出共有多少頁
// 1.查詢rowCount
ps = con.prepareStatement("select count(*) from users");
rs = ps.executeQuery();
rs.next();// 遊标下移
rowCount = rs.getInt();//得到rowCount,總共多少條記錄
// 得到總共有多少頁:總共有rowCount條記錄,每一頁顯示pageSize條記錄,這個頁數根據上文提到的三種算法很好計算
pageCount = (rowCount - ) / pageSize + ;
// 到資料庫中查詢對應的資料,這個select語句要根據pageSize和pageNow計算出來
ps = con.prepareStatement("select t.* from (select ROW_NUMBER() over(order by id) as num,* from users) as t where t.num <=" + pageSize * pageNow + " and t.num >= " + (pageSize * pageNow - pageSize + ));
rs = ps.executeQuery();
out.println("<table );
out.println("<tr align=center><th>ID</th><th>使用者名</th><th>Email</th><th>級别</th><th>修改使用者</th><th>删除使用者</th></tr>");
// 開始循環顯示所有使用者資訊
while (rs.next()) {
out.println("<tr align=center><td>"
+ rs.getInt()
+ "</td><td>"
+ rs.getString()
+ "</td><td>"
+ rs.getString()
+ "</td><td>"
+ rs.getInt()
+ "</td><td><a href=''>修改使用者</a></td><td><a href=''>删除使用者</a></td></tr>");
}
out.println("</table>");
out.println("<br>");
// 顯示上一頁,注意href的寫法
if (pageNow != ) {
out.println("<a title='上一頁' href='/UserManager/ManageUsers?pageNow="
+ (pageNow - ) + "'><</a>");
}
// 顯示分頁
for (int i = ; i <= pageCount; i++) {
// 這個href的寫法很重要
out.println("<a href='/UserManager/ManageUsers?pageNow=" + i+ "'>" + i + "</a>");
}
// 顯示下一頁
if (pageNow != pageCount) {
out.println("<a title='下一頁' href='/UserManager/ManageUsers?pageNow="
+ (pageNow + ) + "'>></a>");
}
// 顯示分頁資訊
out.println(" 目前頁" + pageNow + "/總頁數" + pageCount);
據此,便可以實作分頁顯示的功能,如下:
此時,浏覽器的位址欄是這樣的:
http://localhost:8080/UserManager/ManageUsers?pageNow=3
3.3 分頁查詢的改進
在上述代碼中,隻是實作了簡單的分頁查詢,我們還可以添加如下相關功能:
- 添加跳轉到第幾頁,并且要處理跳轉的時候pageNow的值過大的問題
- 控制我們的超連結隻顯示10頁
假如資料庫中的資料非常之多,pageCount也就非常大,是以我們的頁面不可能完全将所有的頁碼展示出來,這就需要加以控制
這兩個功能的處理思路類似,實作之後,頁面大概是這樣的: