使用ssm做出常见的分页效果

要想做出类似的分页效果很简单,这篇博客就带大家瞧一瞧怎么实现
在这里插入图片描述
我先在这里展示一下最终的效果图,这个样子:
在这里插入图片描述

一、数据库

在这里插入图片描述

二、domain层

1、Person (对应数据库字段)

package com.java.domain;

public class Person {
	private int id;
	private String name;
	private int age;
	private int money;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		this.money = money;
	}
}

2、page(这里涉及算法,如果看不懂可以自己复制出来运行一遍再慢慢理解)

package com.java.domain;

import java.util.List;

public class Page {
	//当前页(前台传入)
	private int pageNum;

	//总的记录数(从数据库中查询出来)
	private int totalNum;
	
	//每页显示的数据量(我这里只让它显示7条数据)
	private int pageSize = 7;
	
	//总页数——计算出来(总记录数/pagesize=总页数)
	private int totalPageNum;
	
	//每页的开始记录数(计算出)
	private int startIndex;
	
	//算出来(开始页与结束页)
	private int startPage;
	private int endPage;
	
	//前台传入
	private String url;
	
	//数据库中查询  将来不知道集合到底会放user 还是person ,所以为了通用性就使用泛型
	private List<?> list = null;

	public Page(int pageNum, int totalNum,String url) {
		this.pageNum = pageNum;
		this.totalNum = totalNum;
		this.url = url;
		
		//如果36条记录,每页7条记录,那么就会有6页
		if(totalNum%pageSize==0){
			totalPageNum = totalNum/pageSize;//35/7 =5
		}else{
			totalPageNum = totalNum/pageSize+1;//36/7 =5   多一条也分一页出来
		}
		
		//最开始前台传入1  那么————(1-1)*7=0【第一页的数据从0开始取7条】      (2-1)*7=7【第二页的数据从7开始取7条】
		startIndex = (pageNum-1)*pageSize;
		
		//如果页数小于5,就显示第1~5页
		if(totalPageNum<5){
			startPage = 1;
			endPage = totalPageNum;
		}else{
			//如果点击前3个,那么还是显示1~5页
			if(pageNum<3){
				startPage = 1;
				endPage =5;
			}else{
				//当前页数大于总记录页数-3,那么显示最后5页;比如说30-4=26,就显示26、27、28、29、30
				if(pageNum>(totalPageNum-3)){
					startPage = totalPageNum-4;
					endPage = totalPageNum;
				}else{
					//其它情况;比如说,12345,点4就显示23456,点5就显示34567
					startPage = pageNum-2;
					endPage = pageNum+2;
				}
			}
		}
		
	}
	
	public int getPageNum() {
		return pageNum;
	}
	public void setPageNum(int pageNum) {
		this.pageNum = pageNum;
	}
	public int getTotalNum() {
		return totalNum;
	}
	public void setTotalNum(int totalNum) {
		this.totalNum = totalNum;
	}
	public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public int getTotalPageNum() {
		return totalPageNum;
	}
	public void setTotalPageNum(int totalPageNum) {
		this.totalPageNum = totalPageNum;
	}
	
	public List<?> getList() {
		return list;
	}
	public void setList(List<?> list) {
		this.list = list;
	}
	public int getStartIndex() {
		return startIndex;
	}
	public void setStartIndex(int startIndex) {
		this.startIndex = startIndex;
	}
	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 String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	
}

二、mapper层

1、接口

package com.java.mapper;

import java.util.List;

import com.java.domain.Page;
import com.java.domain.Person;

public interface PersonMapper {
	//每一页的展示数据的数量
	List<Person> findPagePerson(Page page);
	
	//数据库中 总的记录数
	int findCountPageUser();
}

2、编写sql

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://www.mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace和mapper接口同名 -->
<mapper namespace="com.java.mapper.PersonMapper">
	<!-- id用接口中定义的方法的名字
	
		parameterType:定义输入到sql中的映射类型
		resultType:定义结果映射类型。
	 -->
	<select id="findPagePerson" parameterType="com.java.domain.Page" resultType="com.java.domain.Person">
		select id,name,age,money from test003 Limit #{startIndex},#{pageSize}
	</select>
	
	<select id="findCountPageUser" resultType="int">
		select count(*) from test003 
	</select>
</mapper>

三、service层

package com.java.service;

import com.java.domain.Page;

public interface PersonService {
	Page splitPage(int PageNum,String url);
}

四、serviceImpl层

package com.java.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.java.domain.Page;
import com.java.domain.Person;
import com.java.mapper.PersonMapper;
import com.java.service.PersonService;

@Service
public class PersonServiceImpl implements PersonService{

	@Autowired
	private PersonMapper personMapper;
	
	@Override
	public Page splitPage(int pageNum,String url) {
		//总记录数
		int totalNum = personMapper.findCountPageUser();
		
		Page page = new Page(pageNum,totalNum,url);
		
		//从数据库取到的7条数据
		List<Person> list = personMapper.findPagePerson(page);
		page.setList(list);

		return page;
	}

}

五、control层

package com.java.control;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping;

import com.java.domain.Page;
import com.java.domain.User;
import com.java.service.PersonService;
import com.java.service.impl.UserServiceImpl;

//交给spring管理
@Controller()
public class ControlDemo {	
	@Autowired
	private PersonService personService;
	
	//映射路径	
	@RequestMapping("showPerson")
	public String showPerson(int pageNum,Model model) {
		Page page = personService.splitPage(pageNum,"showPerson.action");
		model.addAttribute("page", page);
		return "person.jsp";		
	}
}

六、Jsp页面

第一个被注释掉的body里写的代码与第二个body比较你会发现,属性href的路径不一样(前者固定死了的而后者没有),因为你在写项目的时候像这种功能的代码肯定不会只使用一次,如果下次再次使用的时候你怎么办?难道再重写一个?显然是不太好的,所以在page类里面写了一个url,下次访问的时候就可以直接取url的值,这样就可以提高代码的复用性,提高我们的效率。

有时候我们还会遇到这种情况,只需要重复使用的是div标签里面的代码,上面部分的会改动,那么我们就可以把div里的代码提取出来,重新建立一个文件夹再新建jsp页面,把div的放入新jsp页面里面,如果需要使用到div里面的代码,我们就可以使用动态包含"<jsp:include page=“public/page.jsp”></jsp:include>"

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<%-- <body>
	<a href="${pageContext.request.contextPath }/showPerson.action?pageNum=1">显示</a>
	<table border="1" width="80%" align="center">
		<tr><th>id</th><th>姓名<th>年龄<th>钱钱</th></tr>
		<c:forEach items="${page.list }" var="person">
			<tr>
				<td>${person.id }</td>
				<td>${person.name }</td>
				<td>${person.age }</td>
				<td>${person.money }</td>
			</tr>
		</c:forEach>
		</table>
		<div align="center">
			《共<span>-${page.totalPageNum }-</span>页》&nbsp;当前&nbsp;《第<span>-${page.pageNum }-</span>页》
		
			<a href="${pageContext.request.contextPath}/showPerson.action?pageNum=1">首页</a>
			
			<c:if test="${page.pageNum>1 }">
				<a href="${pageContext.request.contextPath}/showPerson.action?pageNum=${page.pageNum-1}">上一页</a>		
			</c:if>
		
			<c:forEach begin="${page.startPage}" end="${page.endPage}" var="pageNum">
				<a href="${pageContext.request.contextPath}/showPerson.action?pageNum=${pageNum}">${pageNum }</a>
			</c:forEach>
			
			<c:if test="${page.pageNum<page.totalPageNum }">
				<a href="${pageContext.request.contextPath}/showPerson.action?pageNum=${page.pageNum+1}">下一页</a>
			</c:if>
			
			<a href="${pageContext.request.contextPath}/showPerson.action?pageNum=${page.totalPageNum}">尾页</a>
			
			<form action="${pageContext.request.contextPath}/showPerson.action" method="post" style="display:inline">
				<input type="text" name="pageNum" style="width: 18px">
				<input type="submit" value="Go">
			</form>
		</div>
</body> --%>


<body>
	<a href="${pageContext.request.contextPath }/showPerson.action?pageNum=1">显示</a>
	<table border="1" width="80%" align="center">
		<tr><th>id</th><th>姓名<th>年龄<th>钱钱</th></tr>
		<c:forEach items="${page.list }" var="person">
			<tr>
				<td>${person.id }</td>
				<td>${person.name }</td>
				<td>${person.age }</td>
				<td>${person.money }</td>
			</tr>
		</c:forEach>
		</table>
		
		<%--一般就可以把div里面的东西做成公共页面,因为这串代码会被反复使用,到时候用动态包含 包含进来 <jsp:include page="public/page.jsp"></jsp:include> --%>
		<div align="center">
			《共<span>-${page.totalPageNum }-</span>页》&nbsp;当前&nbsp;《第<span>-${page.pageNum }-</span>页》
		
			<a href="${pageContext.request.contextPath}/${page.url }?pageNum=1">首页</a>
			
			<c:if test="${page.pageNum>1 }">
				<a href="${pageContext.request.contextPath}/${page.url }?pageNum=${page.pageNum-1}">上一页</a>		
			</c:if>
		
			<c:forEach begin="${page.startPage}" end="${page.endPage}" var="pageNum">
				<a href="${pageContext.request.contextPath}/${page.url }?pageNum=${pageNum}">${pageNum }</a>
			</c:forEach>
			
			<c:if test="${page.pageNum<page.totalPageNum }">
				<a href="${pageContext.request.contextPath}/${page.url }?pageNum=${page.pageNum+1}">下一页</a>
			</c:if>
			
			<a href="${pageContext.request.contextPath}/${page.url }?pageNum=${page.totalPageNum}">尾页</a>
			
			<form action="${pageContext.request.contextPath}/${page.url }" method="post" style="display:inline">
				<input type="text" name="pageNum" style="width: 18px" placeholder="${page.pageNum }">
				<input type="submit" value="Go">
			</form>
		</div>
</body>
</html>

效果展示

在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值