Springmvc應用Mongodb分頁實現(xiàn)
對于web應用來說分頁顯示數(shù)據(jù)是是最基本的功能,作為經(jīng)常開發(fā)web應用的程序員來說這個功能也小菜一碟,但是對于初學者來說卻是是個常見的問題,以前自學web開發(fā)的時候對這個問題也是各種google,整了半天才實現(xiàn)。
現(xiàn)在手中的項目正好也需要一個分頁的功能,這個項目用了spring mvc數(shù)據(jù)庫用到了mongodb,自己就寫了一個分頁的標簽供整個項目來使用,今天周六加完班閑著沒事就把分頁的實現(xiàn)寫出來以便大家參考,不當之處歡迎批評指正。
1)分頁:
一般都是把一次查詢分幾次查詢來顯示。用戶每次點擊頁數(shù)(或者上一頁下一頁)的時候實際上一次查詢請求。查詢設定數(shù)據(jù)的條數(shù)返回并顯示。
2)mongodb分頁用到的工具
在查詢的時候需要用到Query來保存用戶的查詢條件,該類有兩個方法是實現(xiàn)分頁功能的核心一個是skip(int),一個是limit(int)方法,其中l(wèi)imit用來限制每次查詢的條數(shù),也是每顯示的條數(shù)。而skip是跳過當前頁之前的所有頁面的數(shù)據(jù)條數(shù)開始查詢
3)分頁關鍵點(所需的數(shù)據(jù)):
i) 每頁顯示的條數(shù)pageSize
ii)當前的頁數(shù)currentPage,而前面的skip方法傳入的參數(shù)就是根據(jù)currentPage和pageSize來決定的,skip = (currentPage-1)*pageSize
4)分頁的具體實現(xiàn)
通過上面的分析,分頁簡單來說就是用戶點擊分頁的時候提交一個關鍵數(shù)據(jù)(currentPage)到后臺,后臺根據(jù)currentPage來進行分頁查詢;至于上面的pageSize,
在后臺設置一個變量來控制即可。
下面是項目中的用來查詢的基類:MongodbBaseDao<T>的部分代碼
//每頁顯示五條
protected static final int PAGE_SIZE = 8;
/**
* 通過條件查詢,查詢分頁結果
*/
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相當于從那條記錄開始
query.limit(PAGE_SIZE);// 從skip開始,取多少條記錄
List<T> datas = this.find(query);
page.build(datas);//獲取數(shù)據(jù)
return page;
}
上面的代碼中Pagination類保存了分頁所需的必要的數(shù)據(jù),比如當前頁currentPage,總頁數(shù)totalPage,總條數(shù)totalCount,當然還有數(shù)據(jù)集合List 用來保存頁面所需的數(shù)據(jù)。另外getEntityClass()是T所對應的class對象(由子類來具體實現(xiàn))。例如項目中有一個子類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;
/** 當前頁 */
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類還有一個重要的build方法,根據(jù)該類封裝的數(shù)據(jù)來設定分了多少頁,具體實現(xiàn)方法如下
/**
* 處理查詢后的結果數(shù)據(jù)
*
* @param items
* 查詢結果集
* @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);
}
所以在對應的controller對應的方法中查詢的時候,可以這么處理
Query query = new Query();
Criteria channleIdCri = Criteria.where("channelId").is(channel_id);
query.addCriteria(channleIdCri);
//獲取當前頁
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
下面需要生成分頁當行條,在這里用到了spring的標簽來處理,對應的是標簽類PaginationTag,該類封裝了頁面表單form對應的id,分頁顯示所需的數(shù)據(jù),以及分頁顯示可點擊的頁面的長度。該類如下
public class PaginationTag extends TagSupport {
/** 列表頁面的form標簽id值 */
private String form;
/** 與后臺交互,保存在request中的 數(shù)據(jù),該數(shù)據(jù)包含l */
private String pageInfo;//request對應的bean包含了分頁的一些數(shù)據(jù)
/** 分頁顯示可點擊頁數(shù)的長度 */
private int size;
public PaginationTag(){
this.form = "form";
this.size = 5;
}
生成的分頁導航條的代碼如下
@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();
}
有上面的標簽可以發(fā)現(xiàn),每次點擊頁面頁數(shù)的時候是用過js的dopage方法來實現(xiàn)的,該js方法根據(jù)form.submit()來提交信息查詢信息(特別是currentPage數(shù)據(jù))
js的代碼如下
function dopage(currentPage,formid){
$("#currentPage").val(currentPage);
$("#" + formid).submit();
}
在jsp頁面中只需要添加上述標簽即可(標簽類Pagination以及轉換成tld文件了—)
<div> <tv:pagination pageInfo="videos" form="video-form" size="5"></tv:pagination> </div>
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- SpringMVC+Mybatis實現(xiàn)的Mysql分頁數(shù)據(jù)查詢的示例
- springmvc+mybatis 做分頁sql 語句實例代碼
- SpringMVC4 + MyBatis3 + SQL Server 2014整合教程(含增刪改查分頁)
- AJAX +SpringMVC 實現(xiàn)bootstrap模態(tài)框的分頁查詢功能
- springmvc4+hibernate4分頁查詢功能實現(xiàn)
- springmvc 分頁查詢的簡單實現(xiàn)示例代碼
- SpringMvc+Mybatis+Pagehelper分頁詳解
- SpringMVC+MyBatis分頁(最新)
- 基于SpringMVC+Bootstrap+DataTables實現(xiàn)表格服務端分頁、模糊查詢
- Java簡單實現(xiàn)SpringMVC+MyBatis分頁插件
相關文章
springboot+springmvc實現(xiàn)登錄攔截
這篇文章主要介紹了springboot+springmvc實現(xiàn)登錄攔截,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10
httpclient 請求http數(shù)據(jù),json轉map的實例
下面小編就為大家?guī)硪黄猦ttpclient 請求http數(shù)據(jù),json轉map的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
Spring集成Web環(huán)境與SpringMVC組件的擴展使用詳解
這篇文章主要介紹了Spring集成Web環(huán)境與SpringMVC組件,它是一個MVC架構,用來簡化基于MVC架構的Web應用開發(fā)。SpringMVC最重要的就是五大組件2022-08-08
spring cloud 使用Hystrix 實現(xiàn)斷路器進行服務容錯保護的方法
本篇文章主要介紹了spring cloud 使用Hystrix 實現(xiàn)斷路器進行服務容錯保護的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05
IKAnalyzer使用不同版本中文分詞的切詞方式實現(xiàn)相同功能效果
今天小編就為大家分享一篇關于IKAnalyzer使用不同版本中文分詞的切詞方式實現(xiàn)相同功能效果,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12

