這篇文章將為大家詳細(xì)講解有關(guān)Springmvc應(yīng)用MongoDB分頁實(shí)現(xiàn)的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)致力于互聯(lián)網(wǎng)網(wǎng)站建設(shè)與網(wǎng)站營(yíng)銷,提供做網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)站開發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營(yíng)銷、微信小程序定制開發(fā)、公眾號(hào)商城、等建站開發(fā),創(chuàng)新互聯(lián)網(wǎng)站建設(shè)策劃專家,為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制解決方案,幫助客戶在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢(shì)。
對(duì)于web應(yīng)用來說分頁顯示數(shù)據(jù)是是最基本的功能,作為經(jīng)常開發(fā)web應(yīng)用的程序員來說這個(gè)功能也小菜一碟,但是對(duì)于初學(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)目來使用,不當(dāng)之處歡迎批評(píng)指正。
1)分頁:
一般都是把一次查詢分幾次查詢來顯示。用戶每次點(diǎn)擊頁數(shù)(或者上一頁下一頁)的時(shí)候?qū)嶋H上一次查詢請(qǐng)求。查詢?cè)O(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)
通過上面的分析,分頁簡(jiǎ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所對(duì)應(yīng)的class對(duì)象(由子類來具體實(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); }
所以在對(duì)應(yīng)的controller對(duì)應(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)簽來處理,對(duì)應(yīng)的是標(biāo)簽類PaginationTag,該類封裝了頁面表單form對(duì)應(yīng)的id,分頁顯示所需的數(shù)據(jù),以及分頁顯示可點(diǎn)擊的頁面的長(zhǎng)度。該類如下
public class PaginationTag extends TagSupport { /** 列表頁面的form標(biāo)簽id值 */ private String form; /** 與后臺(tái)交互,保存在request中的 數(shù)據(jù),該數(shù)據(jù)包含l */ private String pageInfo;//request對(duì)應(yīng)的bean包含了分頁的一些數(shù)據(jù) /** 分頁顯示可點(diǎn)擊頁數(shù)的長(zhǎng)度 */ 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>
關(guān)于“Springmvc應(yīng)用Mongodb分頁實(shí)現(xiàn)的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
網(wǎng)站欄目:Springmvc應(yīng)用Mongodb分頁實(shí)現(xiàn)的示例分析
分享URL:http://jinyejixie.com/article28/gpsccp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、網(wǎng)頁設(shè)計(jì)公司、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、外貿(mào)建站、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)