JSP分頁顯示數據庫中的數據


分頁是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 %>頁&nbsp;

共<%=sum %>有條記錄&nbsp;

當前是第<%=num %>頁&nbsp;   <a href="showGoods.jsp?pageNumber=<%=number-1 %>">上一頁</a>&nbsp;   <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">

  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   <input type = "submit" name="submit" value="刪除" >

  </td>   </tr>   <tr align="center" valign="top">     <td colspan="11">共<%=maxp %>頁&nbsp;共<%=sum %>有條記錄&nbsp;當前是第<%=num %>頁&nbsp;

  <a href="deleteUser.jsp?p=<%=num-1 %>">上一頁</a>&nbsp;   <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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM