舉例詳解用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);
}
}