前端点击按钮>>>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>
<%--分页显示的结束--%>