首页 > 编程 > Java > 正文

springmvc 分页查询的简单实现示例代码

2019-11-26 13:18:52
字体:
来源:转载
供稿:网友

目前较常用的分页实现办法有两种:

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  此部分可以灵活使用

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);   } } 

使用方法:

5,Controller.java

/**    * 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;   }} 

6.maybatis中几条查询语句

//分页查询 <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 != ''">         <!--           特别提醒一下, $只是字符串拼接, 所以要特别小心sql注入问题。          在开发时使用: $,方便调试sql,发布时使用: #         -->         and username like '%${username}%'                 </if>        <if test="type != null and type != ''">         <!--           特别提醒一下, $只是字符串拼接, 所以要特别小心sql注入问题。          在开发时使用: $,方便调试sql,发布时使用: #         -->         AND TYPE = #{type,jdbcType=VARCHAR}          </if>      </where>       order by ${orderName} ${descAsc} )tt)ttt      <where>        <if test="startIndex != null and startIndex != ''">         rn > ${startIndex}                 </if>        <if test="endIndex != null and endIndex != ''">                 <![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 != ''">     and username like '%${username}%'            </if>    </where>  </select> 

7.前台页面index.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 > 

8,引用的Page.jsp

  <%@ 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='display: none'>   <a class=listlink id="indexPageHref" href='#'></a> </div> <script> function getCurrentPage(index){    var a = document.getElementById("indexPageHref");     a.href = '${pathurl}&pageAction=gopage&pageKey='+index+'${urlParams}';       a.setAttribute("onclick",'');        a.click("return false");   } function setEveryPage(everyPage){     var a = document.getElementById("indexPageHref");   var currentPage = document.getElementById('indexChange').value;   a.href = '${pathurl}&pageAction=setpage&pageKey='+everyPage+'${urlParams}';       a.setAttribute("onclick",'');        a.click("return false");   } function sortPage(sortName){     var a = document.getElementById("indexPageHref");     a.href = '${pathurl}&pageAction=sort&pageKey='+sortName+'${urlParams}';      a.setAttribute("onclick",'');      a.click("return false");   } </script> 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表