一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 舉例詳解用Java實現web分頁功能的方法

舉例詳解用Java實現web分頁功能的方法

2020-01-10 17:40treeroot JAVA教程

這篇文章主要介紹了舉例詳解用Java實現web分頁功能的方法,這種基本功能現一般通過Hibernate框架來完成,需要的朋友可以參考下

分頁問題是一個非常普遍的問題,開發者幾乎都會遇到,這里不討論具體如何分頁,說明一下Web方式下分頁的原理。首先是查詢獲得一個結果集(表現為查詢數據庫獲得的結果),如果結果比較多我們一般都不會一下顯示所有的數據,那么就會用分頁的方式來顯示某些數據(比如20條)。因為Http的無狀態性,每一次提交都是當作一個新的請求來處理,即使是換頁,上一次的結果對下一次是沒有影響的。

這里總結三種實現分頁的方式,不知道還有沒有別的!
1.每次取查詢結果的所有數據,然后根據頁碼顯示指定的紀錄。
2.根據頁面只取一頁數據,然后顯示這一頁,這里要構造sql語句。
3.取一定頁數的數據,就是前面兩種的折中。

這里還要注意的是這些數據是放在request還是session中,這里一一討論

1.一般不會放在session中,因為會占用大量內存,所以要放在request里面。
優點:實現比較簡單,查詢速度比較快。
缺點:占用內存多一些,網絡傳輸數據多。
對于數據量比較少的查詢這種方法比較合適。這里有人把數據放在session中,這樣換頁的時候就不用重新查詢,但是這樣是極其不好的,強烈建議不要這樣使用。

2.肯定不會放在session中,因為放在session中沒有意義。
優點:占用內存少。
缺點:比較麻煩,必須先獲得查詢結果的總數,因為要知道有多少紀錄才知道有多少頁。另外要構造分頁查詢語句,對于不同的數據庫是不一樣的。

3.這種情況是肯定放在session中了,要不然我干嗎取好幾頁呀,這樣的實現是為了減少數據庫查詢的次數,比如我保存第1到10的紀錄,那么換頁的時候如果在1到10之間就可以直接從session獲取。如果換到11頁,我可以重新設置緩存11到
20頁的數據(或者5到15頁的數據),這樣的話換10次才需要一次數據庫查詢操作。
優點:占用內存相對不多,提高平均查詢速度。
缺點:實現起來更加復雜,可能存在臟數據,需要自己定義一個緩存集合。如果查詢的數據量比較大,可以考慮采用這樣方式。

下面的設計每次只獲取一頁數據,每次都要重新設置查詢總數,具體如何獲得自己實現,這是一個比較通用的分頁實現。

這里設計一個接口:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package treeroot.util;
import java.util.List;
/**
* 該接口用來實現分頁功能,注意這里沒有提供修改的功能。
* @author treerot
* @version 1.0
* @since 2004-9-30
*/
public interface Pageable
{
  /**
  * 獲得數據結果
  * @return
  */
  public List getResult();
  /**
  * 獲得查詢總數
  * @return
  */
  public int getCount();
  /**
  * 獲得每頁紀錄數
  * @return
  */
  public int getPageSize();
  /**
  * 獲得當前頁編號
  * @return
  */
  public int getCurrentPage();
  /**
  * 獲得總頁數
  * @return
  */
  public int getPages();
  /**
  * 每頁默認顯示紀錄數
  */
  public final static int DEFAULT_PAGESIZE=20;
 
}

這個接口非常簡單,就是包括一個結果列表和一些分頁的必要信息,這里注意幾點:
1.這個接口的實現表示的是某一次查詢的某一頁數據,和上次查詢無關
2.這個接口的實現應該是只讀的,也就是說不可以修改的。
3.getPages()方法是冗余的,但是這里仍然提供這個方法。

下面給出一個抽象實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package treeroot.util;
import java.util.List;
/**
* @author treerot
* @version 1.0
* @since 2004-9-30
*/
public abstract class AbstractPage implements Pageable
{
  private int currentPage;
  private int pageSize;
  private int pages; 
 
  protected int count;
  protected List result;
 
  /**
  * 指定當前頁 
  * @param currentPage
  * @throws PageException
  */
  public AbstractPage(int currentPage){
    this(currentPage,Pageable.DEFAULT_PAGESIZE);
  }
 
  /**
  * 指定當前頁和頁大小
  * @param currentPage
  * @param pageSize
  * @throws PageException
  */
  public AbstractPage(int currentPage,int pageSize) {
    this.currentPage=currentPage;
    this.pageSize=pageSize;
  }
 
  protected void checkPage(int currentPage) throws PageException{
    if((currentPage<1)||(currentPage>this.getPages()))
       throw new PageException("頁超出范圍:總頁數為"+this.getPages()+",當前頁為"+currentPage);
  }
  /**
  * 這個方法被子類重寫用來初始化,也就是計算count值和result結果,在子類 的構造函數中調用。
  */
  abstract protected void init() throws PageException;
  
  public List getResult()
  {
    return result;
  }
 
  public int getCount()
  {
    return count;
  }
 
  public int getPageSize()
  {
    return pageSize;
  }
 
  public int getCurrentPage()
  {
    return currentPage; 
  }
 
  public int getPages()
  {
    if(pages==0) this.pages=(count+pageSize-1)/pageSize;
    return pages;
  }
}

這個抽象類實現了接口中的所有方法,但是定義了一個抽象方法init(),在子類中必須實現這個方法。上面的一個接口和一個抽象類看起來比較簡單,你可能會覺得好像什么都沒有做,實現上確實沒有做什么,但是卻可以給開發帶來很大的幫助。我們可以根據自己的需要要繼承這個抽象類,而數據可以通過各種方式獲得,比如直接通過一個List獲得,或者通過JDBC,Hibernate等等,不過我們都需要把結果封裝到一個List里面,通過Hibernate就顯得特別方便了。

PageException是自定義的一個異常

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package treeroot.util   
/**
* @author treeroot
* @version 1.0
* @since 2004-9-30
*/
public class PageException extends Exception
{
  public PageException(){
    super();
  }
  public PageException(String message){
    super(message);
  }
}

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品馆 | 亚洲成在人网站天堂一区二区 | 青青草国产精品久久久久 | 91精品国产91热久久久久福利 | 视频一区二区国产 | 午夜国产精品福利在线观看 | 亚洲福利一区二区 | 关晓彤被草 | 超兴奋朋友的中文字幕下 | 亚洲ss| 亚洲第一免费播放区 | 国产视频自拍一区 | 男人使劲躁女人视频免费 | 青柠网在线观看视频 | 4444亚洲国产成人精品 | 亚洲精品国产一区二区第一页 | 羞羞一区二区三区四区片 | 国产精品视频一区二区三区不卡 | 青青草原在线 | 国产麻豆传媒在线观看 | 肥胖女人一级毛片 | 欧美va在线观看 | 青青青手机在线观看 | 国产精品一区二区在线观看完整版 | 国产欧美日韩精品一区二区三区 | 欧美草逼网站 | 湿好紧太硬了我太爽了 | 潘金莲西门庆一级淫片aaaaaa | 日韩高清无砖砖区2022 | 被调教的校花 | 欧美亚洲一区二区三区 | 国内精品福利丝袜视频_速 国内精品91久久久久 | 麻豆视频免费在线播放 | 精品国产一区二区在线观看 | 日韩毛片免费线上观看 | 精品高潮呻吟99AV无码视频 | xxxxyoujizz护士| 九九九好热在线 | 免费看国产精品久久久久 | 亚飞与亚基高清国语在线观看 | 91精品国产综合久久福利 |