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