软件编程
位置:首页>> 软件编程>> java编程>> springmvc 分页查询的简单实现示例代码

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

作者:GreenRookie  发布时间:2022-01-09 11:08:22 

标签: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>

来源:http://blog.csdn.net/fiangasdre/article/details/51741456

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com