在web應用程式裡,分頁總讓我們開發人員感到很頭疼,倒不是因為技術上有多麼困難,只是本來和業務沒有太多關係的這麼乙個問題,你卻得花不少功夫來處理。要是稍不留神,時不時出點問題就更鬱悶了。我現在做的乙個專案也到了該處理分頁的時候了,感覺以前處理得都不好,所以這次有所改變,基本目標是在現有(未分頁)的**基礎上,盡量少做修改,並且同樣的**可以應用於不同模組的分頁。以下就是我用的方法:
首先,考慮分頁絕大多數發生在列表時,組合查詢時也需要用到。在我的專案裡,列表的action一般名字為list***actioin,例如客戶列表是listclientsaction等等。在未分頁前,list***action裡會把所有的物件取出,通過request.setattribute()放在request裡,然後將請求轉向到列表的jsp(例如listclients.jsp)顯示出來(你可能會說不要在action裡放業務邏輯,但現在這不是我們考慮的重點)。而分頁後,我們只取使用者請求頁對應的那些物件。為了最大限度的達到**重用,我做了以下工作:
1、新建乙個pager類,該類有beginpage、endpage、currentpage、pagesize和total等int型別的屬性,分別代表開始頁、結束頁、當前頁、每頁記錄數和總記錄數,它主要是讓jsp頁面顯示頁導航使用的。請注意currentpage屬性是從0開始的。
2、新建乙個abstractlistactioin類,並讓所有list***action都繼承它。在這個類裡覆蓋execute()方法,可以在這裡判斷許可權等等,並在判斷許可權通過後執行乙個abstract的act()方法,這個act()由list***action來實現。
3、在abstractlistaction裡增加getpage()方法,用來從request得到使用者請求的頁碼(若未請求則認為是第0頁):
} 4、在abstractlistaction裡增加makepager()方法,用來向request裡增加乙個pager類的例項,供jsp頁面顯示頁導航:
注意在我的專案裡,每頁記錄數是寫在配置檔案裡的,如果你沒有配置檔案,上面第4行setpagesize()的引數直接填數字即可,例如pager.setpagesize(10);
5、這樣,所有的list***action都可以使用getpage()得到請求的頁碼,並且能夠方便的通過makepager()構造需要放在request裡的pager物件了。現在要在從資料庫取資料的**上再做一些修改,即只取所需要的那一部分資料。由於我的專案中使用了hibernate,所以這個修改也不是很困難。未分頁前,在我的listclientsaction裡是通過構造乙個query來得到全部client的,現在,只要在構造這個query後再加兩句(setmaxresults和setfirstresult)即可:
query query = ;//目前存在乙個問題,就是在上面**的第二句中,應該是獲得總記錄數,但我暫時沒有特別好的辦法不得到全部物件而直接得到記錄數,只能很恐怖的用「int total = query.list().size();」,汗……構造query的語句
int total = ;//
得到總記錄數
pager pager = makepager(request, total);//
呼叫父類中的方法構造乙個pager例項
query.setmaxresults(pager.getpagesize());//
設定每頁記錄數
query.setfirstresult(pager.getcurrentpage() * pager.getpagesize()); //
設定開始位置
request.setattribute(pager.class.getname(), pager);//
把pager放在request裡
request.setattribute(client.class.getname(), query.list());
6、最後,我寫了乙個頁導航的jsp頁面pager.jsp,供各個顯示列表的jsp來include,**如下:
"/>[我覺得有必要解釋一下,在上面的**中,關於每一頁對應的url是這樣處理。request.getquerystring()中可能包含「q=2」這樣的頁碼請求,也可能不包含即預設請求第0頁,所以統一用replaceall()方法將其去掉,然後將對應的頁碼請求串(如「q=3」)加在qs的前面。這樣做的好處是,每個模組都可以使用這個頁導航,並且不會丟失url中的其他引數(例如今後加入排序功能後,url中可能包含「direction=desc」這樣的引數)。for(int i=pager.getbeginpage();i<=pager.getendpage();i++)else
%>
]
05-4-14 update:我發現在tomcat4.1和websphere5.0裡,request.getrequesturl()方法得到的位址是不一樣的,所以考慮到相容性,每個頁碼的鏈結都使用相對本頁的鏈結。
在列表jsp(listclients.jsp)中,很簡單的這樣include它(之所以要放在裡,是希望在沒有記錄可顯示的時候就不顯示頁導航了):
">經過上面幾步的處理,我的客戶列表已經可以實現分頁了,效果見下圖。如果在另外乙個模組中也需要分頁,比如部門列表時,只需要1、修改listdeptsaction繼承abstractlistaction,2、在listdeptsaction裡增加setmaxresults()和setfirstresults()方法,3、在listdepts.jsp中適當的位置include頁導航,就可以了,改動是相當小的。
最後,如果希望組合查詢的結果也能夠分頁,必須指定組合查詢表單的method屬性為「get」,這樣查詢要求會被記錄在url中,分頁導航從而能夠正常的工作(每次換頁都將查詢要求和請求的頁碼提交)。
本文**
八進位制
js實現乙個簡單的分頁
tip 只適合一些 小打小鬧 的 js部分如下 var sizep 5 設定每頁顯示的個數 var size sizep 每頁顯示的個數 var up 0 當前頁開始的位置 var down 0 當前頁結束的位置 var v1 0 var v2 0 var up1 0 var up2 0 初始化歷史...
Vue 實現乙個分頁元件
實現分頁元件要分三個部分 樣式,邏輯,和引用 首先新建乙個vue檔案用來承載元件內容 第一步 構建樣式 第二步 編寫邏輯 第三步 引用元件 1.在父元件中引入並註冊 components 2.在data下宣告三個變數 total 0,記錄總條數 display 10,每頁顯示條數 current 1...
自己實現乙個JPA中的分頁
最近有乙個需求必須要使用原生sql進行查詢資料 這就帶來了乙個問題 沒辦法使用jpa直接傳入pageable物件進行分頁查詢 所以就需要自己實現乙個類似jpa分頁的功能 在查了原始碼之後也沒有看到jpa到底是怎麼實現的 如果有知道的請告訴我 所以自己封裝了乙個工具類來模擬了jpa的分頁 下面先讓我們...