要想做出类似的分页效果很简单,这篇博客就带大家瞧一瞧怎么实现
我先在这里展示一下最终的效果图,这个样子:
一、数据库
二、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>页》 当前 《第<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>页》 当前 《第<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>