分頁是web應用程序非常重要的一個技術。數據庫中的數據可能是成千上萬的,不可能把這么多的數據一次顯示在瀏覽器上面。一般根據每行數據在頁面上所占的空間每頁顯示若干行,比如一般20行是一個比較理想的顯示狀態。
分頁的方法主要有以下兩種思路:
(1)取出符合條件的數據,放到數據集或者內存當中,然后逐頁瀏覽。例如,有可能每頁只瀏覽20條記錄,但使用這種分頁方法需要把所有記錄取出來。這種分頁的方法叫做“指針分頁”。指針分頁法主要是利用數據集的指針(或者說集合的下標)來標識。比如分頁要顯示20條數據,那么第一頁的指針從1開始,第二頁的指針從(2-1)*20+1開始到2*20結束,依次類推。“指針分頁”適合數據量和並發量不是很高的應用程序,不適合海量的數據查詢。
(2)對於海量的數據查詢,看多少就取多少,顯然是最佳的解決方法,假如某個表中有200萬條記錄,第一頁取前20條,第二頁取21~40條記錄。此時可以使用:
select top 當前頁*每頁記錄數查詢字段列表 from 表A where 主鍵字段 not in (select top (當前頁-1)*當前頁記錄數主鍵字段 from 表A)
這樣的語句來實現,因為這種查詢方式要使用主鍵,所以叫他做“主鍵分頁”。(mysql可以使用select * from admin limit 2,2進行分頁查詢,從主鍵id=2+1開始(索引從下標為0開始數,第二條,就是id=3這條),往后2條)
對於一個完整的分頁,應當包括記錄數、頁數、當前頁數、上一頁、下一頁、首頁、最后一頁等。所以,無論是指針分頁還是主鍵分頁。需獲獲得一個類似“select count(*) as 記錄總數 from 表名”這樣的語句,從而獲得記錄數。
為了簡便起見,這里就以一個電子商城中的分頁顯示作為一個案例,采用指針分頁法。在新品展示頁面中需要在頁面顯示的是originalList對象中的商品,設計每頁從originalList對象中位置start開始,顯示至位置over(不包含over)結束,則分頁的主要工作在於確定start和over
<%
for(int i = start; i<over; i++){
GoodEntity originalGoods = (GoodEntity)originalList.get(i);
}
%>
分頁步驟
(1)取得originalList對象中的商品的總條數,存放在頁面的變量pageNumber中,並將此值作為總頁數的初始值后,根據每頁顯示商品的數量在進行修改:
int pageNumber = originalList.size();
int sum = pageNumber;//記錄總數
(2)初始化一些必要的參數,其中request.getParameter("pageNumber")是使用request內置對象的getParameter方法獲取參數名為pageNum的請求參數值,這里是用戶要顯示的頁碼。
<% String strNumber=request.getParameter("pageNumber");
int number = 0;//待顯示的頁碼,默認為第一頁 if(strNumber==null||strNumber.equals("0")){//表明在QueryString中沒有pageNum這一個參數,此時顯示第 //一頁的數據 number=1; }else{ number = Integer.parseInt(strNumber);//取的待顯示頁碼,將字符串轉換成整數 } int count = 5;//每頁顯示的條數 int maxPage;//最大頁數 if(sum%5==0){//一頁顯示的記錄數,目前設計為5條 maxPage = sum/5;//最多頁數,能整除的,結果為頁數 }else{ maxPage = sum/5+1;//不能整除的,結果加1 } int start = (number-1)*count;//開始記錄數 int end = number*count;//結束記錄數 if(end>sum-1){ end = sum;//防止越界 } %>
(3)分頁顯示:
<%
for(int i = start; i<over; i++){
GoodEntity originalGoods = (GoodEntity)originalList.get(i);
}
%>
(4)顯示分頁導航:
<tr align="center" valign="top">
實現頁面顯示頁碼總數、記錄總數、和當前頁碼數,上一頁,下一頁:
<td colspan="11">共<%=maxPage %>頁
共<%=sum %>有條記錄
當前是第<%=num %>頁 <a href="showGoods.jsp?pageNumber=<%=number-1 %>">上一頁</a> <a href="showGoods.jsp?pageNumber=<%=number+1 %>">下一頁</a> </td>
</tr>
這個分頁導航中,假如我們是上一頁,那么就是“number-1”,有些人就疑惑,number-1,不是-1了嗎?當最初頁再上一頁,又是怎么顯示回第一頁的?我們可以看看上面的一處代碼:
if(strNumber==null||strNumber.equals("0")){
number=1;
就是這個判斷語句,當我們第一次來訪問的時候,strNumber是null的,number就會被賦值為1,到了顯示那里(number-1)*count就是等於0,然而number的值依然是1,到了導航那里,點擊了“上一頁”,number-1就會等於0,變量值傳遞回本頁面的request接收,因此strNumber.equals("0")條件符合,number=1,還是第1頁,到了顯示那里(number-1)*count還是等於0。其中的小妙處慢慢體會。
下面分享一個實例代碼,是一個人才管理系統中的一個刪除功能的頁面,顯示所有人才信息,提供刪除按鈕,其中也用到分頁技術,不是上面說的例子,不過道理一樣,大家可以參考一下下的:
<%@ page contentType="text/html; charset=gb2312" %> < %@page import="com.communal.UserDao"%> < %@page import="java.util.List"%> < %@page import="com.communal.UserEntity"%> < html> <head> <title>My JSP 'updateUser1.jsp' starting page</title> <style type="text/css"> body { background-image: url(../pic/56923.jpg); background-position: center center; } </style> </head> <!-- "javascript:if(window.confirm('是否確認刪除?')){window.location.href = 'User.jsp?form_insert=2&userid.value';}"
--> <body rightmargin=""> <form action="User.jsp?form_insert=2" name="form_delete" method="post" onsubmit="return submitting()">
<table border = "1" align="center" cellpadding="10" cellspacing="2"> <tr><th colspan="11"><font size="+3">人才信息刪除</font></th></tr>
<tr> <td>待刪除的記錄</td> <td>人才id</td> <td>姓名</td> <td>性別</td> <td>出生年月</td> <td>最高學位</td>
<td>來公司日期</td> <td>轉正日期</td> <td>隸屬部門</td> <td>個人興趣</td> <td>專業特長</td> </tr>
<tr> <% UserDao dao = new UserDao(); List userList = dao.showUser(); %>
<% int num;//當前頁 String p=request.getParameter("p"); if(p==null||p.equals("0")){ num=1; }else{ num = Integer.parseInt(p);
} int count = 5;//每頁顯示的條數 int maxp;//最大頁數 int sum = userList.size();//記錄總數 if(sum%6==0){ maxp = sum/5; }else{ maxp = sum/5+1; }
int start = (num-1)*count;//開始記錄數 int end = num*count;//結束記錄數 if(end>sum-1){ end = sum; } %>
<% for(int i = start; i < end; i++){ UserEntity showUserEntity = (UserEntity)userList.get(i); %> <td align="center">
<input type="checkbox" name="userid" id="userid" value="<%=showUserEntity.getId() %>" style="zoom:180%;"> </td>
<td><div><%=showUserEntity.getId() %></div></td> <td><div><%=showUserEntity.getName() %></div></td>
<td><div><%=showUserEntity.getSex() %></div></td> <td><div><%=showUserEntity.getBirth() %></div></td>
<td><div><%=showUserEntity.getDegree() %></div></td> <td><div><%=showUserEntity.getIn_date() %></div></td>
<td><div><%=showUserEntity.getTrans_date() %></div></td> <td><div><%=showUserEntity.getDept() %></div></td>
<td><div><%=showUserEntity.getInterest() %></div></td> <td><div><%=showUserEntity.getSpecialty() %></div></td>
<tr> <%} %> <tr> <td colspan="11" align="center"> <input type ="reset" value="重置" name="reset">
<input type = "submit" name="submit" value="刪除" >
</td> </tr> <tr align="center" valign="top"> <td colspan="11">共<%=maxp %>頁 共<%=sum %>有條記錄 當前是第<%=num %>頁
<a href="deleteUser.jsp?p=<%=num-1 %>">上一頁</a> <a href="deleteUser.jsp?p=<%=num+1 %>">下一頁</a> </td> </tr>
<tr> <td colspan="11" align="right"><a href="index.html" >返回子系統頁面</a></td> </tr> </table> </form>
<script type="text/javascript"> function submitting(){ if(!window.confirm('是否確認刪除?')){ return false; }
/* if(form_delete.userid.value==""){ alert("你沒有選擇刪除任何人!"); return false; }*/ return true; } </script>
</body> < /html>
