實現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為每頁顯示的記錄條數)