程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 舉例詳解用Java完成web分頁功效的辦法

舉例詳解用Java完成web分頁功效的辦法

編輯:關於JAVA

舉例詳解用Java完成web分頁功效的辦法。本站提示廣大學習愛好者:(舉例詳解用Java完成web分頁功效的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是舉例詳解用Java完成web分頁功效的辦法正文


分頁成績是一個異常廣泛的成績,開辟者簡直都邑碰到,這裡不評論辯論詳細若何分頁,解釋一下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次才須要一次數據庫查詢操作。
長處:占用內存絕對不多,進步均勻查詢速度。
缺陷:完成起來加倍龐雜,能夠存在髒數據,須要本身界說一個緩存聚集。假如查詢的數據量比擬年夜,可以斟酌采取如許方法。

上面的設計每次只獲得一頁數據,每次都要從新設置查詢總數,詳細若何取得本身完成,這是一個比擬通用的分頁完成。

這裡設計一個接口:

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()辦法是冗余的,然則這裡依然供給這個辦法。

上面給出一個籠統完成:

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是自界說的一個異常

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved