[置顶] springmvc 分页查询的简单实现

来源:互联网 发布:乳胶漆调色软件 编辑:程序博客网 时间:2024/05/16 07:06
目前较常用的分页实现办法有两种:
 
  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>  


0 0
原创粉丝点击