注:本文继续分页的上一篇
关于分页,标签,缓存hibernate分页有现成的支持:
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以前是设置currentPage,然后在页面里自己判断上一页下一页是什么,后来发现纯粹多余,完全可以把目标页写进去,而且参数也统一了,以前页面传到Action有好几个参数:
if(method.equals("lastPage")){
}else if(method.equals("nextPage")){
}else if(method.equals("targetPage")){
//.
}
现在统一一个参数就是pageIndex,爽多了 :)
PageBean代码如下:
int currentPage = 1;//当前页:Action控制
int totalPages = 0;//总页数 :自己运算
public static int pageRecorders = 10; //每页记录数,默认为10,可以在初始化的时候修改//总数据数
int pageStartRow = 0; //每页的起始数 [这个字段可以去掉]
int pageEndRow = 0; //每页显示数据的终止数 [这个字段也可以去掉]
boolean hasNextPage = false; //是否有下一页:自己运算
boolean hasPreviousPage = false; //是否有前一页 :自己运算
List objList = new ArrayList();//存放欲展示的对象列表
int totalRows;//总记录数,由底层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只提供有多少条记录,多少页数由PageBean自己运算
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中负责把pageIndex传给PageBean,以及通过service得到的记录总数传给pageBean就OK了
补充:另,在IDEA中文站上看到一篇文章 分页,心中的痛? 提到用一个统一的接口来规范:
代码如下:
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 ();
}
个人感觉思想挺好,不过我还是喜欢用一个PageBean类就足够了,没必要搞复杂了,在PageBean中其实是currentPage为核心.
一个工具能够在任何地方都能容易的嵌入进去,这就很小巧了,也就够用了. :)