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

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)

相关推荐

  • SpringBoot JPA实现增删改查、分页、排序、事务操作等功能示例

    今天给大家介绍一下SpringBoot中JPA的一些常用操作,例如:增删改查.分页.排序.事务操作等功能. 下面先来介绍一下JPA中一些常用的查询操作: //And --- 等价于 SQL 中的 and 关键字,比如 findByHeightAndSex(int height,char sex): public List<User> findByHeightAndSex(int height,char sex); // Or --- 等价于 SQL 中的 or 关键字,比如 findByHei

  • struts2+spring+hibernate分页代码[比较多]第1/7页

    dao层接口: Java代码 复制代码 代码如下: package com.last999.im.news.dao; import java.util.*; import com.last999.im.news.entity.KindEntity; import com.last999.im.news.web.PageTool; public interface KindEntityDao{ public KindEntity get(String uuid); public void save

  • Spring MVC结合Spring Data JPA实现按条件查询和分页

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 推荐视频:尚硅谷Spring Data JPA视频教程,一学就会,百度一下就有. 后台代码:在DAO层继承Spring Data JPA的PagingAndSortingRepository接口实现的 (实现方法主要在SbglServiceImpl.java类中) 前台表现:用kkpaper表现出来 实现效果: 1.实体类 package com.jinhetech.yogurt.sbgl.entity; im

  • SpringMvc+Mybatis+Pagehelper分页详解

    最近公司需要做一个告警页面的功能,需要分页,查了很多资料发现PageHelper比较合适 故写一篇从零开始的PageHelper使用的教程,也记录下忙活一天的东西 1.首先需要在项目中添加PageHelper的依赖,这里我用的Maven添加 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>

  • 基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询

    前言 基于SpringMVC+Bootstrap+DataTables实现数据表格服务端分页.模糊查询(非DataTables Search),页面异步刷新. 说明:sp:message标签是使用了SpringMVC国际化 效果 DataTable表格 关键字查询 自定义关键字查询,非DataTable Search 代码 HTML代码 查询条件代码 <!-- 查询.添加.批量删除.导出.刷新 --> <div class="row-fluid"> <di

  • spring data jpa分页查询示例代码

    最近项目上用就hibernate+spring data jpa,一开始感觉还不错,但是随着对业务的复杂,要求处理一些复杂的sql,就顺便研究了下,把结果记录下,以便日后查看.用到Specification,需要继承JpaSpecificationExecutor接口.(下面代码有的分页从0开始作为第一页,有的从1开始作为作为第一页,我也忘记,请自己测试) DAO层: import java.util.List; import org.springframework.data.domain.Pa

  • Java简单实现SpringMVC+MyBatis分页插件

    1.封装分页Page类 package com.framework.common.page.impl; import java.io.Serializable; import com.framework.common.page.IPage; /** * * * */ public abstract class BasePage implements IPage, Serializable { /** * */ private static final long serialVersionUID

  • Spring Data JPA 复杂/多条件组合分页查询

    话不多说,请看代码: public Map<String, Object> getWeeklyBySearch(final Map<String, String> serArgs, String pageNum, String pageSize) throws Exception { // TODO Auto-generated method stub Map<String,Object> resultMap=new HashMap<String, Object&

  • springboot用thymeleaf模板的paginate分页完整代码

    本文根据一个简单的user表为例,展示 springboot集成mybatis,再到前端分页完整代码(新手自学,不足之处欢迎纠正): 先看java部分 pom.xml 加入 <!--支持 Web 应用开发,包含 Tomcat 和 spring-mvc. --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web&l

  • Spring Data JPA实现分页Pageable的实例代码

    在JPA中提供了很方便的分页功能,那就是Pageable(org.springframework.data.domain.Pageable)以及它的实现类PageRequest(org.springframework.data.domain.PageRequest),详细的可以见示例代码. 1.改变CustomerRepository方法​ /** * 一个参数,匹配两个字段 * @param name2 * @Param pageable 分页参数 * @return * 这里Param的值和

随机推荐