最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

舉例詳解用Java實現(xiàn)web分頁功能的方法

 更新時間:2015年10月22日 08:57:56   作者:treeroot  
這篇文章主要介紹了舉例詳解用Java實現(xiàn)web分頁功能的方法,這種基本功能現(xiàn)一般通過Hibernate框架來完成,需要的朋友可以參考下

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

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

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

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

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

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

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

這里設(shè)計一個接口:

package treeroot.util;
import java.util.List;
/**
* 該接口用來實現(xiàn)分頁功能,注意這里沒有提供修改的功能。
* @author treerot
* @version 1.0
* @since 2004-9-30
*/
public interface Pageable
{
  /**
  * 獲得數(shù)據(jù)結(jié)果
  * @return
  */
  public List getResult();
  /**
  * 獲得查詢總數(shù)
  * @return
  */
  public int getCount();
  /**
  * 獲得每頁紀(jì)錄數(shù)
  * @return
  */
  public int getPageSize();
  /**
  * 獲得當(dāng)前頁編號
  * @return
  */
  public int getCurrentPage();
  /**
  * 獲得總頁數(shù)
  * @return
  */
  public int getPages();
  /**
  * 每頁默認(rèn)顯示紀(jì)錄數(shù)
  */
  public final static int DEFAULT_PAGESIZE=20;

}

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

下面給出一個抽象實現(xiàn):

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;

  /**
  * 指定當(dāng)前頁 
  * @param currentPage
  * @throws PageException
  */
  public AbstractPage(int currentPage){
    this(currentPage,Pageable.DEFAULT_PAGESIZE);
  }

  /**
  * 指定當(dāng)前頁和頁大小
  * @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("頁超出范圍:總頁數(shù)為"+this.getPages()+",當(dāng)前頁為"+currentPage);
  }
  /**
  * 這個方法被子類重寫用來初始化,也就是計算count值和result結(jié)果,在子類 的構(gòu)造函數(shù)中調(diào)用。
  */
  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;
  }
}

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

PageException是自定義的一個異常

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);
  }
}

相關(guān)文章

  • Java線程池實現(xiàn)帶返回值的方式方法

    Java線程池實現(xiàn)帶返回值的方式方法

    在Java中,線程池是一種重要的多線程處理方式,可以有效管理和重用線程,提高程序的性能和效率,有時候我們需要在多線程處理中獲取線程的返回值,本文將介紹如何使用線程池實現(xiàn)帶返回值的方式方法,需要的朋友可以參考下
    2024-09-09
  • java中創(chuàng)建、寫入文件的5種方式

    java中創(chuàng)建、寫入文件的5種方式

    這篇文章主要介紹了java中創(chuàng)建、寫入文件的5種方式,幫助大家更好的理解學(xué)習(xí)Java io的相關(guān)知識,感興趣的朋友可以了解下
    2020-08-08
  • 淺談Java的Synchronized鎖原理和優(yōu)化

    淺談Java的Synchronized鎖原理和優(yōu)化

    這篇文章主要介紹了Java的Synchronized鎖原理和優(yōu)化,synchronized的作用是保證在同一時刻, 被修飾的代碼塊或方法只會有一個線程執(zhí)行,以達(dá)到保證并發(fā)安全的效果,需要的朋友可以參考下
    2023-05-05
  • 半小時實現(xiàn)Java手?jǐn)]網(wǎng)絡(luò)爬蟲框架(附完整源碼)

    半小時實現(xiàn)Java手?jǐn)]網(wǎng)絡(luò)爬蟲框架(附完整源碼)

    最近在做一個搜索相關(guān)的項目,需要爬取網(wǎng)絡(luò)上的一些鏈接存儲到索引庫中,自己寫了一個簡單的網(wǎng)絡(luò)爬蟲,感興趣的可以了解一下
    2021-06-06
  • idea啟動與jar包啟動中使用resource資源文件路徑的問題

    idea啟動與jar包啟動中使用resource資源文件路徑的問題

    這篇文章主要介紹了idea啟動與jar包啟動中使用resource資源文件路徑的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java8異步調(diào)用如何使用才是最好的方式

    java8異步調(diào)用如何使用才是最好的方式

    異步調(diào)用主要用于當(dāng)前程序的執(zhí)行不用等待調(diào)用方法執(zhí)行結(jié)束就可以繼續(xù)執(zhí)行,下面這篇文章主要給大家介紹了關(guān)于java8異步調(diào)用如何使用才是最好的方式,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • 基于UDP協(xié)議實現(xiàn)聊天系統(tǒng)

    基于UDP協(xié)議實現(xiàn)聊天系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了基于UDP協(xié)議實現(xiàn)聊天系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • 新手了解java IO基礎(chǔ)知識

    新手了解java IO基礎(chǔ)知識

    這篇文章主要介紹了java 基礎(chǔ)知識之IO總結(jié)的相關(guān)資料,Java中的I/O分為兩種類型,一種是順序讀取,一種是隨機(jī)讀取,需要的朋友可以參考下,希望對你有幫助
    2021-07-07
  • Java關(guān)于BeabUtils.copyproperties的用法

    Java關(guān)于BeabUtils.copyproperties的用法

    這篇文章主要介紹了Java關(guān)于BeabUtils.copyproperties的用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • MyBatis-Plus 通用IService使用詳解

    MyBatis-Plus 通用IService使用詳解

    這篇文章主要介紹了MyBatis-Plus 通用IService使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評論

卓尼县| 耿马| 临武县| 福建省| 泰宁县| 柳林县| 松江区| 永春县| 丰台区| 且末县| 蒲城县| 普兰县| 常德市| 黔西| 同心县| 铅山县| 花莲市| 邵武市| 个旧市| 顺义区| 正镶白旗| 民勤县| 福州市| 桦南县| 琼海市| 阿坝| 灯塔市| 射洪县| 碌曲县| 灵宝市| 临猗县| 溆浦县| 兴山县| 罗山县| 明溪县| 轮台县| 乐山市| 邳州市| 翼城县| 上蔡县| 柘荣县|