天天看點

Servlet——實作資料分頁顯示Servlet實作資料分頁顯示

Servlet實作資料分頁顯示

1.資料分頁的應用

在很多情況下,Web網頁的顯示結果都很多,不可能在一個頁面完全顯示出來,這時候就需要用到資料分頁

比如我們很熟悉的Google搜尋結果:

Servlet——實作資料分頁顯示Servlet實作資料分頁顯示

那麼怎麼通過Servlet實作這個功能呢?

2.Servlet連接配接資料庫

首先我們的資料是存放在資料庫中,那麼就需要Servlet去連接配接資料庫,進而擷取資料。

Servlet連接配接資料庫的步驟同JavaSE連接配接資料庫的操作一樣

其實Servlet本身也就是Java

首先需要準備Java連接配接資料庫的相關jar包

不同的資料庫有不同的jar包,我使用的是SQLServer 2008 R2版本

,然後将jar包引入項目。

接下來就是正常的5個步驟了:

  1. 加載驅動
  2. 得到連結
  3. 建立PrepareStatement
  4. 執行操作
  5. 根據結果做相應的處理

比如,以登入驗證為例,下述代碼是一個簡單的使用者登入驗證執行個體(要注意這裡省去了異常處理的過程):

// 資料庫連結
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 email 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("&nbsp;&nbsp;&nbsp;目前頁" + pageNow + "/總頁數" + pageCount);
           

據此,便可以實作分頁顯示的功能,如下:

Servlet——實作資料分頁顯示Servlet實作資料分頁顯示

此時,浏覽器的位址欄是這樣的:

http://localhost:8080/UserManager/ManageUsers?pageNow=3

3.3 分頁查詢的改進

在上述代碼中,隻是實作了簡單的分頁查詢,我們還可以添加如下相關功能:

- 添加跳轉到第幾頁,并且要處理跳轉的時候pageNow的值過大的問題

- 控制我們的超連結隻顯示10頁

    假如資料庫中的資料非常之多,pageCount也就非常大,是以我們的頁面不可能完全将所有的頁碼展示出來,這就需要加以控制

這兩個功能的處理思路類似,實作之後,頁面大概是這樣的:

Servlet——實作資料分頁顯示Servlet實作資料分頁顯示