注:本文繼續(xù)分頁的上一篇
關(guān)于分頁,標(biāo)簽,緩存hibernate分頁有現(xiàn)成的支持:
query.setFirstResult(start);
query.setMaxResults(rowNum);?
MySql如下:
select?*?from?table?where?
?limit?start,rowNum;
Oracle如下select?*?from?table?where?
?and?rowid?not?in(select?rowid?from?t_table?where? .... and? rownum<=?(pageIndex-1)?*?size)
and?rownum?<=?size;
PageBean以前是設(shè)置currentPage,然后在頁面里自己判斷上一頁下一頁是什么,后來發(fā)現(xiàn)純粹多余,完全可以把目標(biāo)頁寫進(jìn)去,而且參數(shù)也統(tǒng)一了,以前頁面?zhèn)鞯紸ction有好幾個(gè)參數(shù):
if(method.equals("lastPage")){
}else?if(method.equals("nextPage")){
}else?if(method.equals("targetPage")){
????//
.
}
現(xiàn)在統(tǒng)一一個(gè)參數(shù)就是pageIndex,爽多了? :)
PageBean代碼如下:
int?currentPage?=?1;//當(dāng)前頁:Action控制
????int?totalPages?=?0;//總頁數(shù)?:自己運(yùn)算
????public?static?int?pageRecorders?=?10;?//每頁記錄數(shù),默認(rèn)為10,可以在初始化的時(shí)候修改//總數(shù)據(jù)數(shù)
????int?pageStartRow?=?0;?//每頁的起始數(shù)? [這個(gè)字段可以去掉]
????int?pageEndRow?=?0;?//每頁顯示數(shù)據(jù)的終止數(shù)? [這個(gè)字段也可以去掉]
????boolean?hasNextPage?=?false;?//是否有下一頁:自己運(yùn)算
????boolean?hasPreviousPage?=?false;?//是否有前一頁?:自己運(yùn)算
????List?objList?=?new?ArrayList();//存放欲展示的對象列表
????int?totalRows;//總記錄數(shù),由底層service提供
????//增加上一頁索引?[directly?to?target?page]
????private?int?lastPageIndex?=?1;
????//增加下一頁索引?[directly?to?target?page]
????private?int?nextPageIndex?=?1;
????public?int?getLastPageIndex()?{
????????return?currentPage?-?1;
????}
????public?int?getNextPageIndex()?{
????????return?currentPage?+?1;
????}
????//是否有上一頁
????public?boolean?isHasPreviousPage()?{
????????return?(currentPage?>?1???true?:?false);
????}
????//共有多少頁,service只提供有多少條記錄,多少頁數(shù)由PageBean自己運(yùn)算
????public?int?getTotalPages()?{
????????if?(totalRows?<=?pageRecorders)?return?1;
????????return?(totalRows?%?pageRecorders?==?0???totalRows?/?pageRecorders?:?totalRows?/?pageRecorders?+?1);
????}
????public?int?getCurrentPage()?{
????????return?currentPage;
????}
????public?int?getPageEndRow()?{
????????return?pageEndRow;
????}
????//是否有下一頁
????public?boolean?isHasNextPage()?{
????????return?(currentPage?<?this.getTotalPages()???true?:?false);
????}
????public?int?getTotalRows()?{
????????return?totalRows;
????}
????public?int?getPageStartRow()?{
????????return?pageStartRow;
????}
????public?int?getPageRecorders()?{
????????return?pageRecorders;
????}
????public?void?setObjList(List?objList)?{
????????this.objList?=?objList;
????}
????public?void?setHasPreviousPage(boolean?hasPreviousPage)?{
????????this.hasPreviousPage?=?hasPreviousPage;
????}
????public?void?setTotalPages(int?totalPages)?{
????????this.totalPages?=?totalPages;
????}
????public?void?setCurrentPage(int?currentPage)?{
????????this.currentPage?=?currentPage;
????}
????public?void?setPageEndRow(int?pageEndRow)?{
????????this.pageEndRow?=?pageEndRow;
????}
????public?void?setHasNextPage(boolean?hasNextPage)?{
????????this.hasNextPage?=?hasNextPage;
????}
????public?void?setTotalRows(int?totalRows)?{
????????this.totalRows?=?totalRows;
????}
????public?void?setPageStartRow(int?pageStartRow)?{
????????this.pageStartRow?=?pageStartRow;
????}
????public?void?setPageRecorders(int?pageRecorders)?{
????????this.pageRecorders?=?pageRecorders;
????}
????public?List?getObjList()?{
????????return?objList;
????}
}
在action中負(fù)責(zé)把pageIndex傳給PageBean,以及通過service得到的記錄總數(shù)傳給pageBean就OK了
補(bǔ)充:另,在IDEA中文站上看到一篇文章? 分頁,心中的痛? ????? 提到用一個(gè)統(tǒng)一的接口來規(guī)范:
代碼如下:
public?interface?Page?{
boolean?isFirstPage();
boolean?isLastPage();
boolean?hasNextPage();
boolean?hasPreviousPage();
int?getLastPageNumber();
Object?getThisPageElements();
int?getTotalNumberOfElements();
int?getThisPageFirstElementNumber();
int?getThisPageLastElementNumber();
int?getNextPageNumber();
int?getPreviousPageNumber();
int?getPageSize();
int?getThisPageNumber?();
}
個(gè)人感覺思想挺好,不過我還是喜歡用一個(gè)PageBean類就足夠了,沒必要搞復(fù)雜了,在PageBean中其實(shí)是currentPage為核心.
一個(gè)工具能夠在任何地方都能容易的嵌入進(jìn)去,這就很小巧了,也就夠用了.? :)