springmvc 分页查询的简单实现

Posted GreenRookie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>


以上是关于springmvc 分页查询的简单实现的主要内容,如果未能解决你的问题,请参考以下文章

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

springMVC怎么实现分页显示啊?就是这种效果!

Springmvc+Myabtis+Ajax实现异步分页emp+dept(全部查询及模糊查询)

基于Spring+SpringMVC+MyBatis开发书评网图书分页查询模块采用Ajax动态加载图书信息和实现图书多条件动态查询

mvc 3 怎么实现模糊查询功能

PHP分页初探 一个最简单的PHP分页代码的简单实现