JavaWeb的分頁

1.什麼是分頁

第N頁/共M頁   首頁  上一頁 1 2 3 4 5 6 7 8 9 下一頁 尾頁  [  ]  gojava

  分頁的優勢:只查詢一頁,不用查詢全部頁!數據庫

2.分頁數據

  頁面的數據都是由Servlet傳遞過來的!dom

  Servlet:this

  1.*當前頁:pageCode,pc;編碼

    >pc:若是頁面沒有傳遞當前頁碼,那麼Servlet默認是第一頁,或者按頁面傳遞的爲準!url

  2.*總頁數:totalPages,tpspa

    >tp:總記錄數/每頁記錄數code

  3.*總記錄數:totalRecored,trorm

    >tr:dao來獲取,select count(*) from 表;對象

  4.*每頁記錄數:業務數據或叫系統數據!(由咱們本身來定義)

  5.*當前頁數據:beanList

  6.*url

3.數據的傳遞

  這些分頁數據總要在各層之間來回傳遞!

咱們把這些分頁數據封裝到一個Javabean中,它就叫分頁Bean,例如:PageBean

 1 package cn.itcast.cstm.domain;
 2 
 3 import java.util.List;
 4 
 5 public class PageBean<T> {
 6     private int pc;// 當前頁碼page code
 7 //    private int tp;// 總頁數total page---不須要了,只需get獲得
 8     private int tr;// 總記錄數total record
 9     private int ps;// 每頁記錄數page size
10     private List<T> beanList;// 當前頁的記錄
11     
12     private String url;//它就是url後的條件!
13 
14     public String getUrl() {
15         return url;
16     }
17 
18     public void setUrl(String url) {
19         this.url = url;
20     }
21 
22     public int getPc() {
23         return pc;
24     }
25 
26     public void setPc(int pc) {
27         this.pc = pc;
28     }
29 
30     /**
31      * 計算總頁數
32      * @return
33      */
34     public int getTp() {
35         // 經過總記錄數和每頁記錄數來計算總頁數
36         int tp = tr / ps;
37         return tr%ps==0 ? tp : tp+1;
38     }
39 
40 //    public void setTp(int tp) {
41 //        this.tp = tp;
42 //    }
43 
44     public int getTr() {
45         return tr;
46     }
47 
48     public void setTr(int tr) {
49         this.tr = tr;
50     }
51 
52     public int getPs() {
53         return ps;
54     }
55 
56     public void setPs(int ps) {
57         this.ps = ps;
58     }
59 
60     public List<T> getBeanList() {
61         return beanList;
62     }
63 
64     public void setBeanList(List<T> beanList) {
65         this.beanList = beanList;
66     }
67 }

4.分頁在各層中的處理

  *頁面:給出分頁相關的連接們!

    >頁面須要給Servlet傳遞什麼:有可能傳遞pc(當前頁碼)

  *Servlet:建立PageBaen對象,給PageBean全部的屬性賦值,而後傳遞給頁面。

    >Servlet須要給Dao傳遞

  *Service:調用dao層方法。(中轉)

  *Dao:

    >tr(總記錄數):select count(*)  表名;

    >beanList:select *from 表名 limit x, y;(從數據庫中查詢從第x行開始,查y條記錄---是MySQL的方言)

 

 5.顯示分頁頁碼列表

1 2 3 4 5 6 7 8 9 10

  # 最多顯示多少個頁碼!(暫定爲10);

  # 當前頁,在頁碼中列表中的位置,定爲6;

  只須要當前頁碼來定出來頁碼錶!

  定下來頁碼列表只須要兩樣數據:

    begin

    end

    10 11 12 13 14 (15) 16 17 18 19

  須要使用pc來推算出begin和end

  begin=pc-5 

  end=pc+4

計算公式:

  # 若是總頁數<=10(列表長度),那麼begin=1,end=總頁數

  # 使用公式計算:begin=pc-5,end=pc+4;

    # 頭溢出:當begin<1時,讓begin=1;

    # 尾溢出:當end>${tp}最大頁數,讓end=${tp}

 6.在超連接中要保留參數(搜索時的條件)

   當使用多條件查詢後,而後再點擊第二頁時,這個第二頁超連接沒有條件了,因此會丟失條件,因此咱們須要在頁面上的全部連接都要保留條件!

   咱們要把條件以一個字符串的形式保存到PageBean的url中!這個任務交給Servlet!

也就是獲取請求的路徑及參數(參數中不包括當前頁pc)

    /**
     * 截取url
     *    /項目名/Servlet路徑?參數字符串
     * @param request
     * @return
     */
    private String getUrl(HttpServletRequest request){
         String contextPath=request.getContextPath();//獲取項目名
         String servletPath = request.getServletPath();//獲取Servlet路徑
         String queryString = request.getQueryString();//獲取?以後的參數
         
         //判斷參數部分是否包含pc這個參數,若是包含,須要截取下去,不要這一部分。
         if(queryString.contains("&pc=")){
             //返回指定子字符串在此字符串中最右邊出現處的索引
             int index=queryString.lastIndexOf("&pc=");
             queryString=queryString.substring(0, index);
         }
         
         return contextPath+servletPath+"?"+queryString;
    }

 

 把此次請求獲得的路徑保存到PageBean對象中,而後能夠在頁面獲取,從而不會丟失參數,完成查詢的分頁。

 

注意:在搜索查詢的時候,也就是在Dao層的SQL語句上增長where子句,返回一個PageBean(其中BeanList是查詢獲得的對象集合),而後再分頁實現。

    請求的時候的form表單的請求方式爲GET,這樣所得的URL路徑中包含查詢的參數條件(POST方式不帶查詢的參數條件),而後再處理編碼問題獲得參數條件。完成搜索查詢。

相關文章
相關標籤/搜索