原理
資料庫分頁,從客戶角度來看,主要是提供兩個參數:每頁數量(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<String,String> param=new HashMap<String,String>();param.put("userName", userName);param.put("phone", phone);param.put("currentPage", currentPage);param.put("pageSize", pageSize);IPageList<UserInfo> pList=service.selectList(param);IPager pager=new MiniPager(pList);pager.save2Request(request, "list");return "list";} service層,只需透明傳遞到dao dao層
public IPageList<UserInfo> selectList(HashMap param){IPageList<HashMap> pList=new MyBatisPageList<HashMap>(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<R> {/** * 發出查詢 */void doList();/** * 得到查詢的結果,個數為pageSize的個數 * @return */List<R> 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<R> implements IPageList<R>{private int pageSize=20;//預設20private int currentPage=1;//預設1private int totalCount;private int totalPage;/** * 資料 */private List<R> 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<R> 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<R> 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
--------------------------
如果你對java、swing、各種架構、javascript、css、linux、資料庫編程等知識高度興趣,或者正在從事這些工作,
歡迎加入我的qq技術交流群:java不瘸腿(219345774)