Springmvc應(yīng)用Mongodb分頁實(shí)現(xiàn)
對于web應(yīng)用來說分頁顯示數(shù)據(jù)是是最基本的功能,作為經(jīng)常開發(fā)web應(yīng)用的程序員來說這個(gè)功能也小菜一碟,但是對于初學(xué)者來說卻是是個(gè)常見的問題,以前自學(xué)web開發(fā)的時(shí)候?qū)@個(gè)問題也是各種google,整了半天才實(shí)現(xiàn)。
現(xiàn)在手中的項(xiàng)目正好也需要一個(gè)分頁的功能,這個(gè)項(xiàng)目用了spring mvc數(shù)據(jù)庫用到了mongodb,自己就寫了一個(gè)分頁的標(biāo)簽供整個(gè)項(xiàng)目來使用,今天周六加完班閑著沒事就把分頁的實(shí)現(xiàn)寫出來以便大家參考,不當(dāng)之處歡迎批評指正。
1)分頁:
一般都是把一次查詢分幾次查詢來顯示。用戶每次點(diǎn)擊頁數(shù)(或者上一頁下一頁)的時(shí)候?qū)嶋H上一次查詢請求。查詢設(shè)定數(shù)據(jù)的條數(shù)返回并顯示。
2)mongodb分頁用到的工具
在查詢的時(shí)候需要用到Query來保存用戶的查詢條件,該類有兩個(gè)方法是實(shí)現(xiàn)分頁功能的核心一個(gè)是skip(int),一個(gè)是limit(int)方法,其中l(wèi)imit用來限制每次查詢的條數(shù),也是每顯示的條數(shù)。而skip是跳過當(dāng)前頁之前的所有頁面的數(shù)據(jù)條數(shù)開始查詢
3)分頁關(guān)鍵點(diǎn)(所需的數(shù)據(jù)):
i) 每頁顯示的條數(shù)pageSize
ii)當(dāng)前的頁數(shù)currentPage,而前面的skip方法傳入的參數(shù)就是根據(jù)currentPage和pageSize來決定的,skip = (currentPage-1)*pageSize
4)分頁的具體實(shí)現(xiàn)
通過上面的分析,分頁簡單來說就是用戶點(diǎn)擊分頁的時(shí)候提交一個(gè)關(guān)鍵數(shù)據(jù)(currentPage)到后臺(tái),后臺(tái)根據(jù)currentPage來進(jìn)行分頁查詢;至于上面的pageSize,
在后臺(tái)設(shè)置一個(gè)變量來控制即可。
下面是項(xiàng)目中的用來查詢的基類:MongodbBaseDao<T>的部分代碼
//每頁顯示五條 protected static final int PAGE_SIZE = 8; /** * 通過條件查詢,查詢分頁結(jié)果 */ public Pagination<T> getPage(int currentPage, Query query) { //獲取總條數(shù) long totalCount = this.mongoTemplate.count(query, this.getEntityClass()); //總頁數(shù) int totalPage = (int) (totalCount/PAGE_SIZE); int skip = (currentPage-1)*PAGE_SIZE; Pagination<T> page = new Pagination<T>(currentPage, totalPage, (int)totalCount); query.skip(skip);// skip相當(dāng)于從那條記錄開始 query.limit(PAGE_SIZE);// 從skip開始,取多少條記錄 List<T> datas = this.find(query); page.build(datas);//獲取數(shù)據(jù) return page; }
上面的代碼中Pagination類保存了分頁所需的必要的數(shù)據(jù),比如當(dāng)前頁currentPage,總頁數(shù)totalPage,總條數(shù)totalCount,當(dāng)然還有數(shù)據(jù)集合List 用來保存頁面所需的數(shù)據(jù)。另外getEntityClass()是T所對應(yīng)的class對象(由子類來具體實(shí)現(xiàn))。例如項(xiàng)目中有一個(gè)子類VideoMongodbDao
@Service public class VideoMongodbDao extends MongodbBaseDao<Video> { @Override protected Class<Video> getEntityClass() { return Video.class; } }
分頁數(shù)據(jù)封裝類Pagination<T>,里面提供了分頁的數(shù)據(jù)
public class Pagination<T> { /** 每頁顯示條數(shù) */ private Integer pageSize = 8; /** 當(dāng)前頁 */ private Integer currentPage = 1; /** 總頁數(shù) */ private Integer totalPage = 1; /** 查詢到的總數(shù)據(jù)量 */ private Integer totalNumber = 0; /** 數(shù)據(jù)集 */ private List items; public Integer getPageSize() { return pageSize; }
Pagination類還有一個(gè)重要的build方法,根據(jù)該類封裝的數(shù)據(jù)來設(shè)定分了多少頁,具體實(shí)現(xiàn)方法如下
/** * 處理查詢后的結(jié)果數(shù)據(jù) * * @param items * 查詢結(jié)果集 * @param count * 總數(shù) */ public void build(List items) { this.setItems(items); int count = this.getTotalNumber(); int divisor = count / this.getPageSize(); int remainder = count % this.getPageSize(); this.setTotalPage(remainder == 0 ? divisor == 0 ? 1 : divisor : divisor + 1); }
所以在對應(yīng)的controller對應(yīng)的方法中查詢的時(shí)候,可以這么處理
Query query = new Query(); Criteria channleIdCri = Criteria.where("channelId").is(channel_id); query.addCriteria(channleIdCri); //獲取當(dāng)前頁 String currentPageStr = request.getParameter("currentPage"); int currentPage = 0; if (currentPageStr != null ){ currentPage = Integer.valueOf(currentPageStr); } Pagination<Video> videos = dao.getPage(currentPage, query); m.addAttribute("videos", videos);//from
下面需要生成分頁當(dāng)行條,在這里用到了spring的標(biāo)簽來處理,對應(yīng)的是標(biāo)簽類PaginationTag,該類封裝了頁面表單form對應(yīng)的id,分頁顯示所需的數(shù)據(jù),以及分頁顯示可點(diǎn)擊的頁面的長度。該類如下
public class PaginationTag extends TagSupport { /** 列表頁面的form標(biāo)簽id值 */ private String form; /** 與后臺(tái)交互,保存在request中的 數(shù)據(jù),該數(shù)據(jù)包含l */ private String pageInfo;//request對應(yīng)的bean包含了分頁的一些數(shù)據(jù) /** 分頁顯示可點(diǎn)擊頁數(shù)的長度 */ private int size; public PaginationTag(){ this.form = "form"; this.size = 5; }
生成的分頁導(dǎo)航條的代碼如下
@Override public int doStartTag() throws JspException { int half = size / 2; int point = size / 2 + size % 2; int start = 1; int loop = size; Pagination query = (Pagination) this.pageContext.getRequest().getAttribute(pageInfo); int pageSize = query.getPageSize(); int currentPage = query.getCurrentPage(); int totalPage = query.getTotalPage(); long totalNumber = query.getTotalNumber(); if(totalPage <= size){ start = 1; loop = totalPage; }else{ if(currentPage > point && currentPage < totalPage - half + 1){ start = 1 + (currentPage - point); }else if(currentPage > totalPage - half){ start = totalPage - size + 1; } } if(currentPage<=0){ currentPage = 1; } StringBuilder sb = new StringBuilder(); sb.append("<div class=\"box-ttl\"><div class=\"g4\">共 <span class=\"text-info\">"); sb.append(totalNumber).append("</span> 條數(shù)據(jù)"); sb.append("/共 <span class=\"text-info\">"); if(totalNumber!=0){ sb.append(totalPage).append("</span> 頁!</div><div class=\"box collapsed g6 flt-r\"><ul class=\"nav-menu\">"); }else{ sb.append(0).append("</span> 頁!</div><div class=\"box collapsed g6 flt-r\"><ul class=\"nav-menu\">"); } // 處理上一頁 if(currentPage == 1){ sb.append("<li class=\"disabled\"><a href=\"#\">上一頁</a></li>"); }else{ sb.append("<li><a href=\"javascript:dopage(" + (currentPage - 1) + ",'" + form + "');\">上一頁</a></li>"); } // 處理中間數(shù)據(jù) for(int i = start; i < start + loop; i++){ //<li class="active"><a href="#" rel="external nofollow" rel="external nofollow" >1</a></li> if(currentPage == i){ sb.append("<li class=\"active\"><a href=\"#\">" + i + "</a></li>"); }else{ //<li><a href="#" rel="external nofollow" rel="external nofollow" >2</a></li> sb.append("<li><a href=\"javascript:dopage(" + i + ",'" + form + "');\">" + i + "</a></li>"); } } // 處理下一頁 if(currentPage == totalPage){ sb.append("<li class=\"disabled\"><a href=\"#\">下一頁</a></li>"); }else{ sb.append("<li><a href=\"javascript:dopage(" + (currentPage + 1) + ",'" + form + "');\">下一頁</a></li>"); } sb.append("</ul></div></div>"); sb.append("<input type=\"hidden\" id=\"currentPage\" name=\"currentPage\" value=\"" + currentPage + "\"/>"); try { pageContext.getOut().write(sb.toString()); } catch (IOException e) { throw new JspException(e.toString(), e); } return super.doStartTag(); }
有上面的標(biāo)簽可以發(fā)現(xiàn),每次點(diǎn)擊頁面頁數(shù)的時(shí)候是用過js的dopage方法來實(shí)現(xiàn)的,該js方法根據(jù)form.submit()來提交信息查詢信息(特別是currentPage數(shù)據(jù))
js的代碼如下
function dopage(currentPage,formid){ $("#currentPage").val(currentPage); $("#" + formid).submit(); }
在jsp頁面中只需要添加上述標(biāo)簽即可(標(biāo)簽類Pagination以及轉(zhuǎn)換成tld文件了—)
<div> <tv:pagination pageInfo="videos" form="video-form" size="5"></tv:pagination> </div>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SpringMVC+Mybatis實(shí)現(xiàn)的Mysql分頁數(shù)據(jù)查詢的示例
- springmvc+mybatis 做分頁sql 語句實(shí)例代碼
- SpringMVC4 + MyBatis3 + SQL Server 2014整合教程(含增刪改查分頁)
- AJAX +SpringMVC 實(shí)現(xiàn)bootstrap模態(tài)框的分頁查詢功能
- springmvc4+hibernate4分頁查詢功能實(shí)現(xiàn)
- springmvc 分頁查詢的簡單實(shí)現(xiàn)示例代碼
- SpringMvc+Mybatis+Pagehelper分頁詳解
- SpringMVC+MyBatis分頁(最新)
- 基于SpringMVC+Bootstrap+DataTables實(shí)現(xiàn)表格服務(wù)端分頁、模糊查詢
- Java簡單實(shí)現(xiàn)SpringMVC+MyBatis分頁插件
相關(guān)文章
Springboot詳解如何實(shí)現(xiàn)SQL注入過濾器過程
這篇文章主要介紹了基于springboot實(shí)現(xiàn)SQL注入過濾器,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2022-06-06java 中JDBC連接數(shù)據(jù)庫代碼和步驟詳解及實(shí)例代碼
這篇文章主要介紹了java 中JDBC連接數(shù)據(jù)庫代碼和步驟詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02Java動(dòng)態(tài)代理之?dāng)r截器的應(yīng)用
今天小編就為大家分享一篇關(guān)于Java動(dòng)態(tài)代理之?dāng)r截器的應(yīng)用,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01java 反射getClass .class 的使用方法示例
這篇文章主要介紹了java 反射getClass .class 的使用方法,結(jié)合實(shí)例形式分析了java類反射機(jī)制的相關(guān)操作技巧,需要的朋友可以參考下2019-11-11