1. 程式人生 > >實現Java Web專案分頁功能

實現Java Web專案分頁功能

接觸Java技術以來,專案中實現分頁功能一直以來是一大糾結點。近日終歸算是下定決心研究一下其中的原理了嘍~~~

本次主要研究分頁功能實現原理,所以沒有使用任何框架技術,通過簡單的Servlet、jsp連線MySQL資料庫來實現。

一、準備工作:

1. 在MySQL資料庫中建立資料表,並新增足夠分頁的資料。

2. 使用MyEclipse建立JavaWeb專案。

3. 建立實體類、工具類、DAO、Service、Servlet等,這寫常規東西在這裡均省略掉。

二、分析、實現分頁功能:

1. 通過查詢MySQL資料庫實現分頁的sql語句為:select * from 表名 limit  起始行 , 每頁顯示行數。

2. 頁面顯示頁面資訊包括:總頁數、當前頁數;

    頁面顯示可操作內容包括:首頁、尾頁、上一頁、下一頁的跳轉,以及輸入頁碼,提交後跳轉到指定頁。

3. 實現分頁功能所必須的幾個重要引數:

    * pageSize        // 每頁所顯示的資料條數    --- 根據情況自行定義

    * totalRow       // 資料表中記錄資料的總行數    --- 通過查詢資料表獲得

    * totalPage      //分頁後的總頁數,即資料表中資料共可以分多少頁    --- 通過計算獲得

    * currentPage   //當前頁碼    --- 根據判斷,並計算而獲得

    * rowNum        //每頁起始行在資料表中的行數

4. 分析以上引數的獲取方式:

    (1) pageSize,每頁所顯示的資料條數,這個是根據自己專案情況自己設定的。

    (2) totalRow,資料表中記錄資料的總行數,可以通過“SELECT COUNT(*) FROM 表名”進行查詢。

    (3) totalPage,分頁後的總頁數,通過“totalRow/pageSize”計算獲得;

            總頁數的計算結果有兩種情況:

            ① 總資料分頁後正好為整頁:

                totalPage = totalRow/pageSize;

            ② 總資料分頁後不是整頁:

                totalPage = totalRow/pageSize+1;

    (4) currentPage,當前頁碼,情況較為複雜,需分兩種情況:

             第一頁的內容是通過點選查詢連結,直接獲取的;而從第二頁開始,後面各頁內容均是通過點選自身頁面的翻頁連結獲取的,currentPage的值可以通過連結傳輸引數,從頁面傳遞給後臺。所以該值需要通過判斷來確定:

            ① 當訪問第一頁時,設定currentPage = 1;

            ② 當訪問第二頁之後時,currentPage的值可以通過request.getParameter("currentPage"),從頁面獲取,對應的頁面程式碼為:

<a href="EmployeesServlet/queryAll.do?pageNo=<%=Integer.parseInt(request.getAttribute("pageNo").toString())-1 %>">上一頁</a>
<a href="EmployeesServlet/queryAll.do?pageNo=<%=Integer.parseInt(request.getAttribute("pageNo").toString())+1 %>">下一頁</a>

        對應後臺的判斷程式碼如下:

String page= request.getParameter("page");        // 從頁面接收引數page
if(page == null || page.trim() == 0{              // 當沒有接收到page引數時,即訪問第一頁時查詢連結並沒有傳入引數page
   page = "1";                                    // 設定page的值為1
}
int currentPage = Integer.parseInt(page);         // 將String型別的page引數轉換為int型別的currentPage
if(currentPage < 1){                              // 若當前頁數小於1(在第一頁時點選上一頁,這裡的值會為0、-1、-2......)
   currentPage = 1                                // 設定currentPage的值為1
}
if(currentPage > totalPage){                      // 若當前頁數大於總頁數(在最後一頁點選下一頁,這裡的值會為totalPage+1......)
   currentPage = totalPage;                       // 設定currentPage的值為總頁數
}

    (5) rowNum,每頁起始行在資料表中的行數,其值可通過如下公式進行計算獲得:

int rowNum = (currentPage - 1) * pageSize;

5. 分頁功能實現過程:                                                                                                                             


6.  點選連結或按鈕查詢“首頁”、“尾頁”、指定頁資料:

    ① “首頁”連結實現:

<a href="EmployeesServlet/queryAll.do?">首頁</a>

    ② “尾頁”連結實現:

<a href="EmployeesServlet/queryAll.do?page=<%=request.getAttribute("totalPage") %>">尾頁</a>

    ③  指定頁資料查詢:

    頁面程式碼:

調轉到<input id="in">頁 <input type="button" value="跳轉" onclick="submit()">

    js程式碼:

    <script type="text/javascript">
    	function submit(){
    		var page = document.getElementById("in").value;
    		window.location.href="EmployeesServlet/queryAll.do?page="+page;
    	}
    </script>
三、附上其他 常見資料庫分頁查詢語句
1.oracle資料庫分頁
    select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=startrow

2.DB2資料庫分頁
    Select * from (select rownumber() over() as rc,a.* from (select * from 表名 order by列名) as a) where rc between startrow and endrow

3.SQL Server 2000資料庫分頁
    Select top pagesize * from 表名 where 列名 not in(select top pagesize*page 列名 from 表名 order by列名) order by列名

4.SQL Server 2005資料庫分頁
    Select * from (select 列名,row_number() over(order by 列名1) as 別名from 表名) as t where t.列名1>=startrow and t.列名1<=endrow

5.MySQL資料庫分頁
    Select * from 表名 limit startrow,pagesize
    (Pagesize為每頁顯示的記錄條數)

6.PostgreSQL資料庫分頁
    Select * from 表名 limit pagesize,offset startrow
    (Pagesize為每頁顯示的記錄條數)