前端点击按钮>>>controller层接受QueryVo和前端带过来的数据>>>调用service层产生PageModel对象>>>service层接受到QueryVo,填充起始页start,调用dao层计算出总记录数和第一页的数据集合,通过当前页的页数(QueryVo穿过来的)+总记录数+一页放置几条信息new一个PageModel对象,填充PageModel对象的集合属性和url属性>>>dao层计算每页的数据集合+计算总记录数。

dao层计算出总记录条数+当前页面的数据集合>>>传给service层,service层通过创建PageModel对象,填充url和集合属性后得到完整的PageModel对象,该对象包含了集合、url和分类信息>>>传给controller层,controller层把该对象保存在域中后跳转到显示分页的jsp>>>该jsp动态包含分页页面pageFile.jsp

前端点击按钮跳转到controller层的getUserByPage这个控制器中:

${pageContext.request.contextPath}/user/getUserByPage.action

控制器收到请求,并以QueryVo和Model作为控制器的入参,其中QueryVo[num=1,start=0;rows=5],model用于存值到作用域中:

@Controller
@RequestMapping("user")
public class UserController {
	
	@Autowired
	private UserService userService;//注入service对象
	
	@RequestMapping("getUserByPage")
	public String getUserByPage(QueryVo vo,Model model) {
	
		PageModel pm = userService.getUserByPage(vo);
		//存到域中的值必须名为page,与pageFile中的EL表达式对应
		model.addAttribute("page", pm);
		return "/admin/user/list.jsp";
	}
	
}

QueryVo类(包含分页信息的第一页+查询数据库集合时的起始页+每页放多少条数据):

public class QueryVo {
	
	private Integer num =1;//点进去都是第一页
	private Integer start;//数据库查询第几页的信息
	private Integer rows = 5;//每页放5条信息
	
	//以下是前端可能带过来的数据
	//private Integer cid;
	
	public Integer getCid() {
		return cid;
	}
	public void setCid(Integer cid) {
		this.cid = cid;
	}
	public Integer getNum() {
		return num;
	}
	public void setNum(Integer num) {
		this.num = num;
	}
	public Integer getStart() {
		return start;
	}
	public void setStart(Integer start) {
		this.start = start;
	}
	public Integer getRows() {
		return rows;
	}
	public void setRows(Integer rows) {
		this.rows = rows;
	}
	@Override
	public String toString() {
		return "QueryVo [num=" + num + ", start=" + start + ", rows=" + rows + ", cid=" + cid + "]";
	}

}

service层用来产生PageModel对象:

@Service
public class UserServiceImpl implements UserService{

	@Autowired
	private UserMapper userMapper;

	@Override
	public PageModel getUserByPage(QueryVo vo) {
		
		//填充QueryVo中start的值,该值随着num的变化而变化
		vo.setStart((vo.getNum()-1)*vo.getRows());
		
		//通过dao层得到总记录条数
		int total = userMapper.getTotal();
		//通过dao层得到当前页的数据集合
		List<User> list = userMapper.getUserByPage(vo);
		
		PageModel pm = new PageModel(vo.getNum(), total, 5);
		pm.setRecords(list);
		pm.setUrl("user/getUserByPage.action?1=1");
		return pm;
	}
}

PageModel类:存放分页的相关信息,通过起始页+总记录条数+每页存放数可以算出分页的其他信息。

import java.util.List;

/**
 * 存放分页相关的数据
 *
 */
public class PageModel {
	//基本属性
	private int currentPageNum;//当前页数,由用户指定				*
	
	private int offsetNum;//offset后面的变量
	
	
	public int getOffsetNum() {
		return (currentPageNum-1)*5;
	}

	public void setOffsetNum(int offsetNum) {
		this.offsetNum = offsetNum;
	}


	private static int pageSize = 5 ;//每页显示的条数,固定的				*
	private int totalRecords;//总记录条数,数据库查出来的			    *
	private int totalPageNum;//总页数,计算出来的					*
	private int startIndex;//每页开始记录的索引,计算出来的			    *
	private int prePageNum;//上一页							    *
	private int nextPageNum;//下一页							    *
	
	private List records;//已经分好页的结果集,该list中只有10条记录
	
	//扩展属性
	//一共每页显示9个页码按钮
	private int startPage;//开始页码
	private int endPage;//结束页码
	
	//完善属性
	private String url;
	
	//要想使用我的分页,必须给我两个参数。一个是要看哪一页,另一个是总记录条数
	public PageModel(int currentPageNum,int totalRecords,int pageSize){
		this.currentPageNum = currentPageNum;
		this.totalRecords = totalRecords;
		this.pageSize=pageSize;
		
//		this.prePageNum = currentPageNum-1;
//		this.nextPageNum = currentPageNum+1;
		//计算查询记录的开始索引
		startIndex = (currentPageNum-1)*pageSize;
				
		startPage = currentPageNum - 4; //5
		endPage = currentPageNum + 4;  //13
		
		//计算总页数
		totalPageNum = totalRecords%pageSize==0?(totalRecords/pageSize):(totalRecords/pageSize+1);
		//看看总页数够不够9页
		if(totalPageNum>9){
			//超过了9页
			if(startPage < 1){
				startPage = 1;
				endPage = startPage+8;
			}
			if(endPage>totalPageNum){
				endPage = totalPageNum;
				startPage = endPage-8;
			}
		}else{
			//不够9页
			startPage = 1;
			endPage = totalPageNum;
		}
	}

	//计算上一页是第一页
	public int getPrePageNum() {
		prePageNum = currentPageNum-1;
		if(prePageNum<1){
			prePageNum = 1;
		}
		return prePageNum;
	}

	//计算下一页是第几页
	public int getNextPageNum() {
		nextPageNum = currentPageNum+1;
		if(nextPageNum>totalPageNum){
			nextPageNum = totalPageNum;
		}
		return nextPageNum;
	}
	

	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public int getStartPage() {
		return startPage;
	}
	public void setStartPage(int startPage) {
		this.startPage = startPage;
	}
	public int getEndPage() {
		return endPage;
	
	public void setEndPage(int endPage) {
		this.endPage = endPage;
	}
	public int getCurrentPageNum() {
		return currentPageNum;
	}
	public void setCurrentPageNum(int currentPageNum) {
		this.currentPageNum = currentPageNum;
	}
	public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public int getTotalRecords() {
		return totalRecords;
	}
	public void setTotalRecords(int totalRecords) {
		this.totalRecords = totalRecords;
	}
	public int getTotalPageNum() {
		return totalPageNum;
	}
	public void setTotalPageNum(int totalPageNum) {
		this.totalPageNum = totalPageNum;
	}
	public int getStartIndex() {
		return startIndex;
	}
	public void setStartIndex(int startIndex) {
		this.startIndex = startIndex;
	}
	public void setPrePageNum(int prePageNum) {
		this.prePageNum = prePageNum;
	}
	public void setNextPageNum(int nextPageNum) {
		this.nextPageNum = nextPageNum;
	}
	public List getRecords() {	
		return records;
	}
	public void setRecords(List records) {
		this.records = records;
	}
	@Override
	public String toString() {
		return "PageModel [currentPageNum=" + currentPageNum + ", offsetNum=" + offsetNum + ", totalRecords="
				+ totalRecords + ", totalPageNum=" + totalPageNum + ", startIndex=" + startIndex + ", prePageNum="
				+ prePageNum + ", nextPageNum=" + nextPageNum + ", records=" + records + ", startPage=" + startPage
				+ ", endPage=" + endPage + ", url=" + url + "]";
	}
}

dao层计算总记录条数和当前页的数据集合:

<!-- 计算总记录条数 -->
	<select id="getTotal" resultType="int">
		select count(*) from t_user
	</select>
	
	<!-- 通过当前页start和每一页显示多少条数据row计算出当前页的数据集合,入参为QueryVo,结果集为User对象的集合 -->
	<select id="getUserByPage" parameterType="QueryVo" resultType="User">
		select * from t_user limit #{start},#{rows}
	</select>

分页页面的代码模版pageFile.jsp(封装好了下一页、上一页、首页、末页的超链接路径,在service层中给定准确的url即可):

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
	<%--分页显示的开始 --%>
    	<div style="text-align:center">
    		共${page.totalPageNum}页/第${page.currentPageNum}页
    		
    		<!-- /pet/pet/petPage.action?cid=1&num=1 -->
    		<a href="${pageContext.request.contextPath}/${page.url}&num=1">首页</a>
    		<a href="${pageContext.request.contextPath}/${page.url}&num=${page.prePageNum}">上一页</a>
    		<%--显示的页码,使用forEach遍历显示的页面 --%>
    		<c:forEach begin="${page.startPage}" end="${page.endPage}" var="pagenum">
    			<a href="${pageContext.request.contextPath}/${page.url}&num=${pagenum}">${pagenum}</a>
    		</c:forEach>
    		
    		<a href="${pageContext.request.contextPath}/${page.url}&num=${page.nextPageNum}">下一页</a>
    		<a href="${pageContext.request.contextPath}/${page.url}&num=${page.totalPageNum}">末页</a>
    		<input type="text" id="pagenum" name="pagenum" size="1"/><input type="button" value="前往" onclick="jump()" />
    		<script type="text/javascript">
    			function jump(){
    				var totalpage = ${page.totalPageNum};
    				var pagenum = document.getElementById("pagenum").value;
    				//判断输入的是一个数字
    				var reg =/^[1-9][0-9]{0,1}$/;
    				if(!reg.test(pagenum)){
    					//不是一个有效数字
    					alert("请输入符合规定的数字");
    					return ;
    				}
    				//判断输入的数字不能大于总页数
    				if(parseInt(pagenum)>parseInt(totalpage)){
    					//超过了总页数
    					alert("不能大于总页数");
    					return;
    				}
    				//转向分页显示的Servlet
    				window.location.href="${pageContext.request.contextPath}/${page.url}&num="+pagenum;
    			}
    		</script>
    	</div>
    	<%--分页显示的结束--%>