成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Springmvc應(yīng)用Mongodb分頁實(shí)現(xiàn)的示例分析

這篇文章將為大家詳細(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)

營(yíng)銷型網(wǎng)站建設(shè)
伊金霍洛旗| 舟山市| 广州市| 綦江县| 台南市| 象山县| 肇源县| 齐河县| 嫩江县| 璧山县| 宁国市| 柳林县| 习水县| 镇康县| 溆浦县| 喀喇| 布拖县| 淄博市| 曲周县| 高邑县| 义马市| 武功县| 乐东| 宁陵县| 霍州市| 湖南省| 通江县| 新竹市| 安康市| 安宁市| 田东县| 尉犁县| 曲靖市| 长武县| 旅游| 册亨县| 毕节市| 渑池县| 项城市| 宁安市| 兴安县|