搜尋
首頁php教程PHP开发springmvc 分頁查詢的簡單實作範例程式碼

目前較常用的分頁實現辦法有兩種:

1.每次翻頁都修改SQL,向SQL傳入相關參數去資料庫即時查出該頁的資料並顯示。

2.查出資料庫某張表的全部數據,再透過在業務邏輯裡面進行處理去取得某些數據並顯示。

對於資料量並不大的簡單的管理系統而言,第一種實作方法相對來說容易使用較少的程式碼實作分頁這一功能,本文也正是為大家介紹這種方法:

程式碼片段:

1,Page.java

package com.cm.contract.common; 
  
import org.apache.commons.lang.StringUtils; 
import org.apache.commons.lang.builder.ToStringBuilder; 
  
  
  
/**分页类 
 * @author FENGWEI 
 * @date 2016-5-23 
 */
public class Page implements java.io.Serializable{ 
    
  private static final long serialVersionUID = 1L; 
  //前一页 
  private Boolean hasPrePage; 
  //后一页 
  private Boolean hasNextPage; 
  //每页显示多少条:默认20条 
  private Long everyPage = 20L; 
  //总页数 
  private Long totalPage; 
  //当前第多少页:默认第1页 
  private Long currentPage = 1L; 
  //开始下标 
  private Long beginIndex; 
  //结束下标 
  private Long endinIndex; 
  //总共多少条 
  private Long totalCount;   
  //排序列名 
  private String sortName;   
  //排序状态 
  private String sortState;   
  //排序信息 
  private String sortInfo; 
  //是否排序 
  private Boolean sort = false; 
  private String defaultInfo = " "; 
    
    
    
  public String getDefaultInfo() { 
    return defaultInfo; 
  } 
  
  public void setDefaultInfo(String defaultInfo) { 
    this.defaultInfo = defaultInfo; 
  } 
  
  public String getSortInfo() { 
    return sortInfo; 
  } 
  
  public void setSortInfo(String sortInfo) { 
    this.sortInfo = sortInfo; 
  } 
  
  public String getSortName() { 
    return sortName; 
  } 
  
  public void setSortName(String sortName) { 
    setPageSortState(sortName);    
  } 
  
  public String getSortState() { 
    return sortState; 
  } 
  
  public void setSortState(String sortState) { 
    this.sortState = sortState; 
  } 
  
    
  public Page() { 
  } 
  
  /** 
   * 常用,用于计算分页 
   * */
  public Page(Long totalRecords){    
    this.totalCount = totalRecords; 
    setTotalPage(getTotalPage(totalRecords));    
  } 
    
  /** 
   * 设置每页显示多少条时使用 
   * */
  public Page(Long everyPage,Long totalRecords){  
    this.everyPage = everyPage; 
    this.totalCount = totalRecords; 
    setTotalPage(getTotalPage(totalRecords));    
  } 
    
  /** 
   * @param state  状态码 
   * @param value  到第多少页或者设置每页显示多少条或者为排序列名 
   */
  public void pageState(int index,String value) {         
    sort = false; 
    switch (index) { 
    case 0 :setEveryPage(Long.parseLong(value));break; 
    case 1 :first();break; 
    case 2: previous();break; 
    case 3: next();break; 
    case 4: last();break; 
    case 5: sort = true;sort(value);break; 
    case 6 ://到指定第多少页 
      setCurrentPage(Long.parseLong(value)); 
      break;      
    } 
  } 
  
  /** 
   * 最前一页 
   */
  private void first() { 
    currentPage = 1L; 
  } 
  
  private void previous() { 
    currentPage--; 
  } 
  
  private void next() { 
    currentPage++; 
  } 
  
  private void last() { 
    currentPage = totalPage; 
  } 
  
  private void sort(String sortName) {     
    //设置排序状态 
    setPageSortState(sortName);    
  } 
      
    
    
  /** 
   * 计算总页数 
   * */
  private Long getTotalPage(Long totalRecords) { 
     Long totalPage = 0L;   
     everyPage = everyPage == null ? 10L : everyPage; 
     if (totalRecords % everyPage == 0) 
      totalPage = totalRecords / everyPage; 
     else { 
      totalPage = totalRecords / everyPage + 1; 
     } 
     return totalPage; 
  }   
    
  
  public Long getBeginIndex() { 
    this.beginIndex = (currentPage - 1) * everyPage; 
    return this.beginIndex; 
  } 
  
  public void setBeginIndex(Long beginIndex) { 
    this.beginIndex = beginIndex; 
  } 
  
  public Long getCurrentPage() { 
    this.currentPage = currentPage == 0 ? 1 : currentPage; 
    return this.currentPage; 
  } 
  
  public void setCurrentPage(Long currentPage) { 
    if(0 == currentPage){ 
      currentPage = 1L; 
    } 
    this.currentPage = currentPage; 
  } 
  
  public Long getEveryPage() { 
    this.everyPage = everyPage == 0 ? 10 : everyPage; 
    return this.everyPage; 
  } 
  
  public void setEveryPage(Long everyPage) {    
    this.everyPage = everyPage; 
  } 
  
  public Boolean getHasNextPage() { 
    this.hasNextPage = (currentPage != totalPage) && (totalPage != 0); 
    return this.hasNextPage; 
  } 
  
  public void setHasNextPage(Boolean hasNextPage) { 
    this.hasNextPage = hasNextPage; 
  } 
  
  public Boolean getHasPrePage() { 
    this.hasPrePage = currentPage != 1; 
    return this.hasPrePage; 
  } 
  
  public void setHasPrePage(Boolean hasPrePage) { 
    this.hasPrePage = hasPrePage; 
  } 
  
  public Long getTotalPage() { 
    return this.totalPage; 
  } 
  
  public void setTotalPage(Long totalPage) { 
    if(this.currentPage > totalPage){ 
      this.currentPage = totalPage; 
    } 
    this.totalPage = totalPage; 
  } 
  
  public Long getTotalCount() { 
    return this.totalCount; 
  } 
  
  public void setTotalCount(Long totalCount) { 
    setTotalPage(getTotalPage(totalCount));  
    this.totalCount = totalCount; 
  } 
  
  @Override
  public String toString() { 
    return ToStringBuilder.reflectionToString(this); 
  } 
    
  /** 
   * 设置排序状态 
   * */
  private void setPageSortState(String newPageSortName){    
    //判断之前的排序字段是否为空 
    if(StringUtils.isEmpty(sortName)){ 
      //默认排序为升序 
      this.sortState = PageUtil.ASC;    
      this.sortInfo = PageUtil.PAGE_ASC;            
    }else{ 
      if(StringUtils.equalsIgnoreCase(newPageSortName, sortName)){ 
        //判断sortState排序状态值 
        if(StringUtils.equalsIgnoreCase(sortState, PageUtil.ASC)){ 
          this.sortState = PageUtil.DESC; 
          this.sortInfo = PageUtil.PAGE_DESC;                
        }else{ 
          this.sortState = PageUtil.ASC; 
          this.sortInfo = PageUtil.PAGE_ASC;          
        }         
      }else{ 
        //默认 
        this.sortState = PageUtil.ASC;    
        this.sortInfo = PageUtil.PAGE_ASC; 
      } 
    } 
    sortName = newPageSortName.toLowerCase();       
  } 
  
  public Boolean isSort() { 
    return sort; 
  } 
  
  public void setSort(Boolean sort) { 
    this.sort = sort; 
  } 
  
  
  public Long getEndinIndex() { 
    this.endinIndex = (currentPage) * everyPage; 
    return endinIndex; 
  } 
  
  public void setEndinIndex(Long endinIndex) { 
    this.endinIndex = endinIndex; 
  }   
}

2.PageState.java

package com.cm.contract.common; 
  
import org.apache.commons.lang.StringUtils; 
  
  
  
  
/**分页状态类 
 * @author FENGWEI 
 * @date 2016-5-23 
 */
public enum PageState { 
    
  /** 
   * 设置每页显示多少条 
   * */
  SETPAGE, 
  /** 
   * 首页 
   * */
  FIRST,  
  /** 
   * 向前一页 
   * */
  PREVIOUS,  
  /** 
   * 向后一页 
   * */
  NEXT,  
  /** 
   * 末页 
   * */
  LAST,  
  /** 
   * 排序 
   * */
  SORT, 
  /** 
   * 到第多少页 
   * */
  GOPAGE; 
  
    
  /** 
   * @param value 索引名称 
   * @return 返回索引下标 
   */
  public static int getOrdinal(String value) { 
    int index = -1; 
    if (StringUtils.isEmpty(value)) { 
      return index; 
    } 
    String newValue = StringUtils.trim(value).toUpperCase(); 
    try { 
      index = valueOf(newValue).ordinal(); 
    } catch (IllegalArgumentException e) {} 
    return index; 
  } 
}

3.PageUtil.java

/** 
 * 分页工具类 
 * @author FENGWEI 
 * @date 2016-5-23 
 */
public class PageUtil { 
    
  public static final String ASC = "asc"; 
  public static final String DESC = "desc"; 
  public static final String PAGE_DESC = "↓"; 
  public static final String PAGE_ASC = "↑"; 
  public static final String PAGE_NULL = " ";  
  public static final String SESSION_PAGE_KEY = "page";   
    
    
  /** 
   * 初始化分页类 
   * @param initPageSql 未分页的查询SQL 
   * @param totalCount  总行数 
   * @param index    分页状态 
   * @param value    只有在设置每页显示多少条时,值不会NULL,其它为NULL 
   */
  public static Page inintPage(Long totalCount,Integer index,String value,Page sessionPage){  
    Page page = null; 
    if(index < 0){ 
       page = new Page(totalCount); 
    }else{ 
       /**每页显示多少条*/
       Long everPage = null == value ? 10 : Long.parseLong(value); 
       /**获取Session中的分页类,方便保存页面分页状态*/
       page = sessionPage;        
       page.setEveryPage(everPage); 
       page.setTotalCount(totalCount);       
    }   
    return page;     
  } 
    
    
  
    
  /** 
   * 当页点击:首页,前一页,后一页,末页,排序,到第多少页时进行分页操作 
   * @param index 分页状态 
   * @param value 排序字段名或者到第多少页 
   */
  public static Page execPage(int index,String value,Page sessionPage){  
    Page page = sessionPage;       
    /**调用方法进行分页计算*/
    page.pageState(index,value);     
    return page;     
  } 
  
}

4.DefaultController.java 5,Controller.java 

package com.cm.contract.common; 
  
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 
  
import org.springframework.web.bind.annotation.ModelAttribute; 
  
/** 
 * 提取公用的request和response Title:DefaultController Descrption: 
 * 
 * @author FENGWEI 
 * @date 2016-5-6下午3:30:32 
 */
public class DefaultController { 
  
  /** 
   * oracel的三层分页语句 子类在展现数据前,进行分页计算! 
   * 
   * @param querySql 
   *      查询的SQL语句,未进行分页 
   * @param totalCount 
   *      根据查询SQL获取的总条数 
   * @param columnNameDescOrAsc 
   *      列名+排序方式 : ID DESC or ASC 
   */
  protected Page executePage(HttpServletRequest request, Long totalCount) { 
    if (null == totalCount) { 
      totalCount = 0L; 
    } 
    /** 页面状态,这个状态是分页自带的,与业务无关 */
    String pageAction = request.getParameter("pageAction"); 
    String value = request.getParameter("pageKey"); 
  
    /** 获取下标判断分页状态 */
    int index = PageState.getOrdinal(pageAction); 
  
    Page page = null; 
    /** 
     * index < 1 只有二种状态 1 当首次调用时,分页状态类中没有值为 NULL 返回 -1 2 当页面设置每页显示多少条: 
     * index=0,当每页显示多少条时,分页类要重新计算 
     * */
    Page sessionPage = getPage(request); 
  
    if (index < 1) { 
      page = PageUtil.inintPage(totalCount, index, value, sessionPage); 
    } else { 
      page = PageUtil.execPage(index, value, sessionPage); 
    } 
    setSession(request, page); 
    return page; 
  } 
  
  private Page getPage(HttpServletRequest request) { 
    Page page = (Page) request.getSession().getAttribute( 
        PageUtil.SESSION_PAGE_KEY); 
    if (page == null) { 
      page = new Page(); 
    } 
    return page; 
  } 
  
  private void setSession(HttpServletRequest request, Page page) { 
    request.getSession().setAttribute(PageUtil.SESSION_PAGE_KEY, page); 
  } 
}

6.maybatis中幾條查詢語句

/** 
   * model 添加的分页条件 
   * executePage 方法写在工具类中 
   * @param model 
   */
@Controller
public class CMLogController extends DefaultController { 
@RequestMapping("index.do") 
  public ModelAndView userInto(ModelMap model, String username) { 
    nameStr = username; 
    model.addAttribute("username", nameStr); 
    // 分页数 
    Long totalCount = logService.pageCounts(model); 
    // 分页显示 
    Page page = executePage(request, totalCount); 
    if (page.isSort()) { 
      model.put("orderName", page.getSortName()); 
      model.put("descAsc", page.getSortState()); 
    } else { 
      model.put("orderName", "logtime"); 
      model.put("descAsc", "desc"); 
    } 
    model.put("startIndex", page.getBeginIndex()); 
    model.put("endIndex", page.getEndinIndex()); 
    ModelAndView mv = new ModelAndView(); 
    // 分页查询 
    logList = logService.pageList(model); 
    mv.addObject("logList", logList); 
    mv.setViewName("/jsp/log"); 
    return mv; 
  }}

7.前台頁index.jsp

//分页查询 
<select id="pageList" parameterType="map" resultMap="BaseResultMap">   
      
    select ttt.* from(select tt.*,rownum rn from(select * from CM_LOG 
    <where>      
      <if test="username != null and username != &#39;&#39;"> 
        <!--  
         特别提醒一下, $只是字符串拼接, 所以要特别小心sql注入问题。 
         在开发时使用: $,方便调试sql,发布时使用: # 
        -->
        and username like &#39;%${username}%&#39;           
      </if> 
       <if test="type != null and type != &#39;&#39;"> 
        <!--  
         特别提醒一下, $只是字符串拼接, 所以要特别小心sql注入问题。 
         在开发时使用: $,方便调试sql,发布时使用: # 
        -->
        AND TYPE = #{type,jdbcType=VARCHAR}    
      </if> 
     </where>  
     order by ${orderName} ${descAsc} )tt)ttt 
     <where>  
      <if test="startIndex != null and startIndex != &#39;&#39;"> 
        rn > ${startIndex}           
      </if>  
      <if test="endIndex != null and endIndex != &#39;&#39;">        
         <![CDATA[ and rn <= ${endIndex} ]]>               
      </if>   
     </where>      
</select> 
// 分页数 
 <select id="pageCounts" parameterType="map" resultType="long">   
  select count(*) from CM_LOG  
  <where>  
  <if test="username != null and username != &#39;&#39;"> 
    and username like &#39;%${username}%&#39;          
  </if>  
  </where>  
</select>

8,引用的Page.jsp

//只需在页面布局添加该div 
  //username 为条件  
  // <jsp:param name="url" value="/log/index.do?"/>    不带条件的方式 问号必须存在 
<body > 
  <div align="right" style="height: 20"> 
      <jsp:include page="/jsp/page.jsp"> 
          <jsp:param name="url" value="/log/index.do?username=${username }"/>     
  
        </jsp:include> 
    </div> 
  
    </body >

  <%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<c:set var="page" value="${sessionScope.page}" /> 
<c:set var="path" value="${pageContext.request.contextPath}" /> 
<c:set var="url" value="${param.url}" /> 
<c:set var="urlParams" value="${param.urlParams}" /> 
<c:set var="pathurl" value="${path}/${url}" /> 
<tr> 
  <td colspan="5"> 
  ${urlParams } 
    共${page.totalCount}条记录 共${page.totalPage}页 每页显示${page.everyPage}条 
    当前第${page.currentPage}页  
    <c:choose> 
      <c:when test="${page.hasPrePage eq false}"> 
        <<首页 <上页  
      </c:when> 
      <c:otherwise> 
        <a href="${pathurl}&pageAction=first${urlParams}"><<首页 </a>  
        <a href="${pathurl}&pageAction=previous${urlParams}" /><上一页</a> 
      </c:otherwise> 
    </c:choose> 
     ||  
    <c:choose> 
      <c:when test="${page.hasNextPage eq false}"> 
         下页> 尾页>> 
      </c:when> 
      <c:otherwise> 
        <a href="${pathurl}&pageAction=next${urlParams}">下一页> </a>  
        <a href="${pathurl}&pageAction=last${urlParams}">末页>></a> 
      </c:otherwise> 
    </c:choose> 
       
    <SELECT name="indexChange" id="indexChange"
      onchange="getCurrentPage(this.value);"> 
      <c:forEach var="index" begin="1" end="${page.totalPage}" step="1"> 
        <option value="${index}" ${page.currentPage eq index ? "selected" : ""}> 
          第${index}页 
        </option> 
      </c:forEach> 
    </SELECT> 
       
    每页显示:<select name="everyPage" id="everyPage" onchange="setEveryPage(this.value);"> 
          <c:forEach var="pageCount" begin="5" end="${page.totalCount}" step="5">             
            <option value="${pageCount}" ${page.everyPage eq pageCount ? "selected" : ""}> 
              ${pageCount}条 
            </option> 
          </c:forEach> 
        </select> 
  </td> 
</tr> 
<div style=&#39;display: none&#39;> 
  <a class=listlink id="indexPageHref" href=&#39;#&#39;></a> 
</div> 
<script> 
function getCurrentPage(index){  
  var a = document.getElementById("indexPageHref");   
  a.href = &#39;${pathurl}&pageAction=gopage&pageKey=&#39;+index+&#39;${urlParams}&#39;;     
  a.setAttribute("onclick",&#39;&#39;);      
  a.click("return false");   
} 
function setEveryPage(everyPage){   
  var a = document.getElementById("indexPageHref"); 
  var currentPage = document.getElementById(&#39;indexChange&#39;).value; 
  a.href = &#39;${pathurl}&pageAction=setpage&pageKey=&#39;+everyPage+&#39;${urlParams}&#39;;     
  a.setAttribute("onclick",&#39;&#39;);      
  a.click("return false");   
} 
function sortPage(sortName){   
  var a = document.getElementById("indexPageHref");   
  a.href = &#39;${pathurl}&pageAction=sort&pageKey=&#39;+sortName+&#39;${urlParams}&#39;;    
  a.setAttribute("onclick",&#39;&#39;);    
  a.click("return false");   
} 
</script>

8,引用的Page.jsp

rrreee

學習有所幫助,也希望大家多多支援PHP中文網。

更多springmvc 分頁查詢的簡單實作範例程式碼相關文章請關注PHP中文網!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。