国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

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

2019-11-26 14:54:54
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

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

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

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

2.肯定不會(huì)放在session中,因?yàn)榉旁趕ession中沒(méi)有意義。
優(yōu)點(diǎn):占用內(nèi)存少。
缺點(diǎn):比較麻煩,必須先獲得查詢結(jié)果的總數(shù),因?yàn)橐烙卸嗌偌o(jì)錄才知道有多少頁(yè)。另外要構(gòu)造分頁(yè)查詢語(yǔ)句,對(duì)于不同的數(shù)據(jù)庫(kù)是不一樣的。

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

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

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

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

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

下面給出一個(gè)抽象實(shí)現(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)前頁(yè)   * @param currentPage  * @throws PageException  */  public AbstractPage(int currentPage){    this(currentPage,Pageable.DEFAULT_PAGESIZE);  }  /**  * 指定當(dāng)前頁(yè)和頁(yè)大小  * @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("頁(yè)超出范圍:總頁(yè)數(shù)為"+this.getPages()+",當(dāng)前頁(yè)為"+currentPage);  }  /**  * 這個(gè)方法被子類重寫(xiě)用來(lái)初始化,也就是計(jì)算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;  }}

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

PageException是自定義的一個(gè)異常

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 磴口县| 尼木县| 乌苏市| 册亨县| 平顺县| 达孜县| 屏东市| 三门峡市| 登封市| 扎兰屯市| 河津市| 泌阳县| 广东省| 凤庆县| 汤原县| 秦皇岛市| 松原市| 太仆寺旗| 汉阴县| 夏河县| 瓮安县| 博兴县| 寿阳县| 永清县| 祥云县| 濉溪县| 昌都县| 余江县| 红原县| 平泉县| 浮山县| 靖宇县| 泗洪县| 枣庄市| 湖北省| 香河县| 高唐县| 湘潭县| 江达县| 山西省| 乌拉特中旗|