原理
数据库分页,从客户角度来看,主要是提供两个参数:每页数量(pageSize),当前页(currentPage)。从后台处理来看,主要是分页查询数据库,查询总数;所以只需处理好这两个参数就可以完成分页了。
本文内容
本文的封装参考easyjweb pageList名字,(只是以前用过,继承关系实现应该都不一样)。
本文中总共设计到了两个核心接口:
IPageList: 数据查询和结果承载的主接口
IPager: 页面相关处理接口
另外,提供了抽象类,做公共处理,见AbstractPageList、AbstractPager。
如因为持久层使用技术的不同,要实现使用该接口,请继承AbstractPageList类,实现抽象方法。
如想实现自己的页面显示的分页组件,请继承AbstractPager类,实现抽象方法。
本文,下面的下载中,会有ibatis和mybatis的两个IPageList实现的实现。这就是说,如果您的项目使用的是上述两种持久层,则可以直接拿来使用。否则,请继承AbstractPageList实现响应持久层的代码。
使用方法
IPageList pList=new XxxPageList([param]);//初始化,设置参数
pList.doList();//发出实际查询
pList.getResult();//可选操作,得到并处理相应数据
IPager pager=new XxxPager(pageList);//创建分页组件类
pager.save2Request(request,"listName");//保存数据,以及分页组件到页面
页面合适的位置放置${pager}
如果这里看的不是很明白,我举个web三次应用中的实际代码,方便大家理解(struts2+spring+mybatis)
action层public String doList(){
HttpServletRequest request=ServletActionContext.getRequest();
String callNum=request.getParameter("userName");
String accNum=request.getParameter("phone");
if(StringUtils.isBlank(userName)&&StringUtils.isBlank(phone)){
request.setAttribute("message", "查询参数不能全空");
return "list";
}
//获得分页参数
String currentPage=request.getParameter("currentPage");
String pageSize=request.getParameter("pageSize");
HashMap param=new HashMap();
param.put("userName", userName);
param.put("phone", phone);
param.put("currentPage", currentPage);
param.put("pageSize", pageSize);
IPageList pList=service.selectList(param);
IPager pager=new MiniPager(pList);
pager.save2Request(request, "list");
return "list";
}
service层,只需透明传递到dao
dao层public IPageList selectList(HashMap param){
IPageList pList=new MyBatisPageList(sqlSession, "user.selectList", "user.selectListCount", param);
pList.doList();
return pList;
}
这样写大家应该都能对这个比较容易理解了吧。页面上,只需在table列表下面加上${pager}就可以了,里面包含了js,和页面需要的html等内容。
主要的接口和抽象实现
IPageList.java
import java.util.List;
/**
*
* 分页接口,对于采用不同持久化方案的分页,继承该类并实现相应方法即可使用
* 使用方法:
* 1.IPageList pList=new XxxPageList([param]);//初始化,设置参数
* 2.pList.doList();//发出实际查询
* 3.pList.getResult();//可选,得到并处理相应数据
* 4.IPager pager=new XxxPager(pageList);//创建分页组件类
* 5.pager.save2Request(request,"listName");//保存数据,以及分页组件到页面
* 6.页面合适的位置放置${pager}
*
* 注意,sql语句要带有分页参数startNum, endNum
* @author wutb1
* 2013-10-31 上午11:02:23
* @version 1.0.0.0
*/
public interface IPageList {
/**
* 发出查询
*/
void doList();
/**
* 得到查询的结果,个数为pageSize的个数
* @return
*/
List getResult();
/**
* 设置每页大小
* @param pageSize
*/
void setPageSize(int pageSize);
/**
* 得到当前设置的每页大小
* @return
*/
int getPageSize();
/**
* 设置当前页
* @param currentPage
*/
void setCurrentPage(int currentPage);
/**
* 得到设置的当前页
* @return
*/
int getCurrentPage();
/**
* 得到符合记录的总个数
* @return
*/
int getTotalCount();
/**
* 得到总的分页数
* @return
*/
int getTotalPage();
}
IPager.java
import javax.servlet.http.HttpServletRequest;
/**
* 页面上分页组件的抽象
* 1.定义页面分页组件
* 2.返回页面参数
* 使用方式
* 1.IPager pager=new XxxPager(IPageList);
* 2.pager.save2Request(request,"listName");
*
* @author wutb1
* 2014-4-22 下午07:36:15
* @version 1.0.0.0
*/
public interface IPager {
void setPageList(IPageList pList);
IPageList getPageList();
/**
* 保存PageList中的数据到页面
* @param request
* @param listName
*/
void save2Request(HttpServletRequest request,String listName);
/**
* 得到页面分页组件,一般包含
* 1.组件的html
* 2.分页用隐藏域
* 3.组件响应的js处理方法
*
* @return
*/
String getPager();
}
AbstractPageList.java
import java.util.List;
/*
* 分页抽象类,实现公用的部分
* 1.分页参数的处理pageSize、currentPage、totalCount、totalPage
* 2.查询生命周期
* @non javadocs
* @see IPageList
*/
public abstract class AbstractPageList implements IPageList{
private int pageSize=20;//默认20
private int currentPage=1;//默认1
private int totalCount;
private int totalPage;
/**
* 数据
*/
private List result;
public void doList(){
beforeQuery();
result=queryList();
totalCount=queryTotalCount();
//计算总页数
calTotalPage();
afterQuery();
}
/**
* 计算总页数
*/
private void calTotalPage(){
totalPage=(int)Math.ceil((double)totalCount/pageSize);
}
/**
* 抽象方法,根据currentPage和pageSize查询数据
* @return
*/
protected abstract List queryList();
/**
* 抽象方法,查询总的数据数量
* @return
*/
protected abstract int queryTotalCount();
/**
* 两个回调函数
*/
protected abstract void beforeQuery();
protected abstract void afterQuery();
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getTotalCount() {
return totalCount;
}
public int getTotalPage() {
return totalPage;
}
public List getResult() {
return result;
}
}
AbstractPager.java
public abstract class AbstractPager implements IPager{
private IPageList pageList;
public IPageList getPageList() {
return this.pageList;
}
public void setPageList(IPageList pageList) {
this.pageList=pageList;
}
/*
* (non-Javadoc)
* @see cn.com.jiexun.utils.IPageUtil#save2Request(javax.servlet.http.HttpServletRequest, java.lang.String)
*/
public void save2Request(HttpServletRequest request, String listName) {
saveCommon(request);
request.setAttribute(listName, getPageList().getResult());
}
private void saveCommon(HttpServletRequest request){
request.setAttribute("pageSize", getPageList().getPageSize());
request.setAttribute("currentPage", getPageList().getCurrentPage());
request.setAttribute("totalCount", getPageList().getTotalCount());
request.setAttribute("totalPage", getPageList().getTotalPage());
//html页面,分页组件
request.setAttribute("pager", getPager());
}
}
下载地址
http://pan.baidu.com/s/1hqgg8Bi
--------------------------