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>

时间: 2024-12-12 01:12:18

springmvc 分页查询的简单实现的相关文章

SpringMVC分页查询无法直接将对象转换成json的解决办法(报org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type:错)

在用ajax获得分页数据时,无法将获取的值赋值给input标签,在修改用户信息时不显示用户已经注册的信息,百度可知 springmvc处理分页数据返回的对象时,无法直接将对象转换成json,会报org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type:错误, 需要在springmvc返回前先转换为json 步骤如下: 1.添加依赖(

PHP分页查询的简单方法。

<table width="100%" border="1" cellpadding="0" cellspacing="0">  首先建立一个表格<tr> <td>代号</td>    <td>区域名称</td>    <td>父级代号</td></tr><?phpinclude("../DBDA.php

SQL Server中的分页查询

分页查询很简单,具体代码如下: --分页查询 --查询1-3行数据 select top 3 * from emp order by sal desc; --查询4-6行数据 select top 3 * from emp where empno not in (select top 3 empno from emp order by sal desc) order by sal desc; --查询7-9行数据 select top 3 * from emp where empno not i

sql查询语句如何解析成分页查询?

我们公司主要mysql存储数据,因此也封装了比较好用mysql通用方法,然后,我们做大量接口,在处理分页查询接口,没有很好分查询方法.sql查询 语句如何解析成“分页查询”和“总统计”两条语句.可能,很多人在处理“总统计”是这样:“select count(*) from (<sql原查询语句>) ”,而不是把原sql查询语句中columns替换成“count(*)”:相比前者统计查询效率高不高,大家心知肚明.“分页查询”很简单,对于mysql语句就是在原sql查询语句后面加上“limit 数

MySQL分页查询性能优化

当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点.下面简单说一下我知道的一些方法. 准备工作 为了对下面列举的一些优化进行测试,下面针对已有的一张表进行说明. 表名:order_history 描述:某个业务的订单历史表 主要字段:unsigned int id,tinyint(4) int type 字段情况:该表一共37个字段,不包含text等大型数组,最大为varcha

数据库有百万数据量的情况下,分页查询的方法及其优化方式

当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点. 下面简单说一下我知道的一些方法. 准备工作 为了对下面列举的一些优化进行测试,下面针对已有的一张表进行说明. 表名:order_history 描述:某个业务的订单历史表 主要字段:unsigned int id,tinyint(4) int type 字段情况:该表一共37个字段,不包含text等大型数据,最大为varch

sql优化之大数据量分页查询(mysql)

当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时就需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点. 谈优化前的准备工作 为了对下面列举的一些优化进行测试,需要使用已有的一张表作为实际例子. 表名:order_history. 描述:某个业务的订单历史表. 主要字段:unsigned int id,tinyint(4) int type. 字段情况:该表一共37个字段,不包含text等大型数据,最大为varchar(500

Mybatis+SpringMVC实现分页查询(附源码)

Maven+Mybatis+Spring+SpringMVC实现分页查询(附源码) 一.项目搭建 关于项目搭建,小宝鸽以前写过一篇Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建,这篇文章提供了详细的搭建过程,而且提供了源码下载,接下来的将在这个源码的基础上继续开发.所以建议各位猿友可以把猿友下载一下. 二.分页插件的介绍 博主采用的插件是PageHelper这个插件,使用起来十分方便.该插件支持以下数据库: Oracle Mysql MariaDB SQLite

Mybatis + SpringMVC + Maven实现分页查询

使用Mybatis + Maven + SpringMVC 运行时,突然被需要分页查询的功能给难住了 这里推荐采用的插件是PageHelper这个插件,使用起来十分方便.该插件支持以下数据库: Oracle Mysql MariaDB SQLite Hsqldb PostgreSQL DB2 SqlServer(2005+) Informix H2 对应于github的项目地址: https://github.com/pagehelper/Mybatis-PageHelper 关于使用建议猿友们