• 在SpringBoot或者Spring项目中实现最原始的分页功能


    不得不感慨自己的写代码水平还是有很大的提升空间,甚至是我觉得很烂来形容吧,近两天一直有一个项目的分页功能很让我头疼,是一个关于SpringBoot的项目,因为可能平时实战项目做的少,由于是学生的原因吧,反正就是自己的不足,导致这个问题困扰着我,又因为忙着考研,所有最近也没时间花心思来慢慢写和整理,但是一直让我焦急万分啊,于是花了两个晚上细细斟酌别人的代码实现,然后开始啥都不看,自己手写实现全面的分页功能,到现在为止总算是小有所成吧,基本完成需求了。后面会学习PageHelper分页插件简化分页的复杂步骤,但是这种原始的写法,自己一定要随手捏来,十分锻炼水平,后面要更加努力的学习了早上再也不能睡到11点了,太颓废(小声逼逼晚上学习带玩熬夜太晚)哈哈哈!

    下面是本次实现分页的代码部分:

    首先需要一个关于分页的实体类来映射前后端数据,使其具有完整性,也把代码的冗余性降到了最低水准

    package com.liuliu.web;
    
    /**
     * @author yuqiliu
     * @create 2020-02-19  22:31
     */
    import java.util.List;
    
    public class Page<T> {
    
    
        private int pageNo;//当前是第几页
    
    
        private List<T> list; //当前显示的图书列表集合
    
    
        private int pageSize = 3;//页面的尺寸数
    
    
        public long getTotalItemNumber() {
            return totalItemNumber;
        }
    
        private long totalItemNumber;//总的条目数
    
        private int totalPageNumber;//总页数
    
    
        public Page(int pageNo) {
            super();
            this.pageNo = pageNo;
        }
    
    
        public int getPageNo() {
            if(pageNo < 0)
                pageNo = 1;
    
            if(pageNo > getTotalPageNumber()){
                pageNo = getTotalPageNumber();
            }
    
            return pageNo;
        }
    
        public Page() {
        }
    
        public void setPageNo(int pageNo) {
            this.pageNo = pageNo;
        }
    
        public void setPageSize(int pageSize) {
            this.pageSize = pageSize;
        }
    
        public int getPageSize() {
            return pageSize;
        }
    
        public void setList(List<T> list) {
            this.list = list;
        }
    
        public List<T> getList() {
            return list;
        }
    
        public void setTotalPageNumber(int totalPageNumber) {
            this.totalPageNumber = totalPageNumber;
        }
    
        public int getTotalPageNumber(){
    
            totalPageNumber = (int)totalItemNumber / pageSize;
    
            if(totalItemNumber % pageSize != 0){
                totalPageNumber++;
            }
    
            return totalPageNumber;
        }
    
        public void setTotalItemNumber(long totalItemNumber) {
            this.totalItemNumber = totalItemNumber;
        }
    
        public boolean isHasNext(){
            if(getPageNo() < getTotalPageNumber()){
                return true;
            }
    
            return false;
        }
    
        public boolean isHasPrev(){
            if(getPageNo() > 1){
                return true;
            }
    
            return false;
        }
    
        public int getPrevPage(){
            if(isHasPrev()){
                return getPageNo() - 1;
            }
    
            return getPageNo();
        }
    
        public int getNextPage(){
            if(isHasNext()){
                return getPageNo() + 1;
            }
    
            return getPageNo();
        }
    }
    
    

    下面从Dao -> Service -> Controller重新梳理一遍我的结论过程

    Book.java

    package com.liuliu.pojo;
    
    import java.sql.Date;
    
    public class Book {
    	
    	private Integer id;
    	private String author;
    	
    	private String title;
    	private float price;
    	
    	private Date publishingDate;
    	private int salesAmount;
    	
    	private int storeNumber;
    	private String remark;
    	
    	public Integer getId() {
    		return id;
    	}
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	public String getAuthor() {
    		return author;
    	}
    	public void setAuthor(String author) {
    		this.author = author;
    	}
    	public String getTitle() {
    		return title;
    	}
    	public void setTitle(String title) {
    		this.title = title;
    	}
    	public float getPrice() {
    		return price;
    	}
    	public void setPrice(float price) {
    		this.price = price;
    	}
    	public Date getPublishingDate() {
    		return publishingDate;
    	}
    	public void setPublishingDate(Date publishingDate) {
    		this.publishingDate = publishingDate;
    	}
    	public int getSalesAmount() {
    		return salesAmount;
    	}
    	public void setSalesAmount(int salesAmount) {
    		this.salesAmount = salesAmount;
    	}
    	public int getStoreNumber() {
    		return storeNumber;
    	}
    	public void setStoreNumber(int storeNumber) {
    		this.storeNumber = storeNumber;
    	}
    	public String getRemark() {
    		return remark;
    	}
    	public void setRemark(String remark) {
    		this.remark = remark;
    	}
    	@Override
    	public String toString() {
    		return "Book [id=" + id + ", author=" + author + ", title=" + title
    				+ ", price=" + price + ", publishingDate=" + publishingDate
    				+ ", salesAmount=" + salesAmount + ", storeNumber="
    				+ storeNumber + ", remark=" + remark + "]
    
    ";
    	}
    	
    	
    		
    }
    
    

    BookDao.java

    package com.liuliu.mapper;
    
    import com.liuliu.pojo.Book;
    import com.liuliu.web.Page;
    import org.apache.ibatis.annotations.Mapper;
    import org.springframework.stereotype.Repository;
    
    import java.sql.SQLException;
    import java.util.HashMap;
    import java.util.List;
    
    /**
     * @author yuqiliu
     * @create 2020-02-19  0:18
     */
    
    @Mapper
    @Repository
    public interface BookDAO {
    
    
    
        //获取全部书籍
        public List<Book> queryAllbook();
    
        //分页查询操作
        public Page selectByPage(int currentPage,int pageSize,HashMap<String,Object> map)throws SQLException;
    
        //获取总的书籍数量
        public int totalItemNumber();
    
        //当页的数据
        public List<Book> selectByPageItem(HashMap<String,Object> map);
    
    
    }
    
    

    BookMapper.xml

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!--namespace=绑定一个对应的Dao/Mapper接口-->
    <mapper namespace="com.liuliu.mapper.BookDAO">
    
        <select id="queryAllbook" resultType="Book">
            select * from bookstore.mybooks
        </select>
    
        
        <select id="selectByPageItem" resultType="Book" parameterType="map">
            select * from bookstore.mybooks limit #{startIndex} ,#{pageSize}
        </select>
    
    
        <select id="totalItemNumber" resultType="int">
            select count(*) from bookstore.mybooks
        </select>
    
    </mapper>
    

    BookService.java

    package com.liuliu.service;
    
    import com.liuliu.pojo.Book;
    import com.liuliu.web.Page;
    import org.springframework.stereotype.Service;
    
    import java.sql.SQLException;
    import java.util.HashMap;
    import java.util.List;
    
    /**
     * @author yuqiliu
     * @create 2020-02-19  0:32
     */
    
    
    @Service
    public interface BookService {
    
        public List<Book> queryAllbook();
    
        public Page selectByPage(int currentPage,int pageSize,HashMap<String,Object> map)throws SQLException;
        
    
    //---------------------------------------------------------------------------------------------------
    
    
        //获取总的书籍数量
        public int totalItemNumber();
    
    
        //当页的数据
        public List<Book> selectByPageItem(HashMap<String,Object> map);
    
    }
    
    

    BookServiceImpl.java

    package com.liuliu.serviceImpl;
    
    import com.liuliu.mapper.BookDAO;
    import com.liuliu.pojo.Book;
    import com.liuliu.service.BookService;
    import com.liuliu.web.Page;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.sql.SQLException;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @author yuqiliu
     * @create 2020-02-19  0:33
     */
    
    
    @Service
    public class BookServiceImpl implements BookService {
    
        @Autowired
        private BookDAO bookDAO;
    
        @Override
        public List<Book> queryAllbook() {
            return null;
        }
    
        @Override
        public Page selectByPage(int currentPage, int pageSize,HashMap<String,Object> map) throws SQLException {
            Page<Book> page=new Page<>();
            page.setPageNo(currentPage);
            page.setPageSize(pageSize);
            page.setTotalItemNumber(totalItemNumber());
            int totalPageNumber=page.getTotalPageNumber();
            page.setTotalPageNumber(totalPageNumber);
            page.setList(selectByPageItem(map));
    
            return page;
        }
    
    
    
    
    //-------------------------------------------------------------------------------------------------------
        @Override
        public int totalItemNumber() {
            return bookDAO.totalItemNumber();
        }
    
        @Override
        public List<Book> selectByPageItem(HashMap<String, Object> map) {
            return bookDAO.selectByPageItem(map);
        }
    
    
    
    }
    
    
    

    PageController.java

    package com.liuliu.controller;
    
    import com.liuliu.serviceImpl.BookServiceImpl;
    import com.liuliu.web.Page;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    
    import javax.servlet.http.HttpServletRequest;
    import java.sql.SQLException;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @author yuqiliu
     * @create 2020-02-20  12:23
     */
    
    
    @Controller
    public class PageController {
    
        @Autowired
        private BookServiceImpl bookService;
    
        @GetMapping("/toPage")
        public String pageController(Integer currentPage, Integer pageSize, Model model, HttpServletRequest request) throws SQLException {
    
    
            pageSize=3;
            if(request.getParameter("currentPage")==null)
            {
                currentPage=1;
            }
            else
            {
                currentPage=Integer.parseInt(request.getParameter("currentPage"));
            }
    
            HashMap<String, Object> map = new HashMap<String, Object>();
    
    
    
    
            System.out.println(currentPage);
            map.put("startIndex",(currentPage-1)*pageSize);
            map.put("pageSize",pageSize);
    
            Page page = bookService.selectByPage(currentPage, pageSize,map);
            model.addAttribute("pageBean",page);
            return "index";
        }
    }
    
    

    前端使用的是 Thymeleaf 模板引擎渲染

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>图书展示首页</title>
        <style type="text/css">
            .table{
                 80%;
                margin: auto;
            }
            .tableCenter{
                text-align: center;
            }
        </style>
    </head>
    <body>
    
    <form th:action="@{/toPage}" th:method="get">
                <div class="tableCenter">
                    <table class="table" width="700" style="table-layout: fixed;">
                        <thead>
                        <th>ID</th>
                        <th>Author</th>
                        <th>Title</th>
                        <th>Price</th>
                        <th>PublishingDate</th>
                        <th>SalesAmount</th>
                        <th>StoreNumber</th>
                        <th>Remark</th>
                        </thead>
                        <tbody>
                        <tr th:each="Book:${pageBean.list}">
                            <td th:text="${Book.id}"></td>
                            <td th:text="${Book.author}"></td>
                            <td th:text="${Book.title}"></td>
                            <td th:text="${Book.price}"></td>
                            <td th:text="${Book.publishingDate}"></td>
                            <td th:text="${Book.salesAmount}"></td>
                            <td th:text="${Book.storeNumber}"></td>
                            <td th:text="${Book.remark}"></td>
                        </tr>
    
                        <tr>
                            <td colspan="8">
                                第 [[${pageBean.pageNo}]] /  [[${pageBean.totalPageNumber}]]
                                    每页显示[[${pageBean.pageSize}]]条  &nbsp;&nbsp;&nbsp;
                                    总的记录数[[${pageBean.totalItemNumber}]] &nbsp;&nbsp;&nbsp;
                                &nbsp;&nbsp;
                                    <a th:href="@{/toPage(currentPage=1)}" th:if="${pageBean.pageNo != 1 }">首页</a>
                                    <a th:href="@{/toPage(currentPage=${(pageBean.pageNo)-1})}" th:if="${pageBean.pageNo != 1}">上一页</a>
    
    
                                <a th:each="i : ${#numbers.sequence(1,pageBean.totalPageNumber)}"
                                   th:if="${pageBean.pageNo==i}">[[${i}]]</a>
    
                                <a th:each="i : ${#numbers.sequence(1,pageBean.totalPageNumber)}"
                                    th:href="@{/toPage(currentPage=${i})}">[[${i}]]</a>
    
    
                                    <a th:if="${pageBean.pageNo != pageBean.totalPageNumber}"
                                       th:href="@{/toPage(currentPage=${pageBean.pageNo+1})}">下一页</a>
                                    <a th:if="${pageBean.pageNo != pageBean.totalPageNumber}"
                                       th:href="@{/toPage(currentPage=${pageBean.totalPageNumber})}">尾页</a>
    
                                转到 <input type="text" size="1" name="currentPage"/> 页
                            </td>
                        </tr>
    
                        </tbody>
                    </table>
    
                </div>
    
    </form>
    
    </body>
    </html>
    
    

    注:本次分页的成功源于知乎上收藏的两篇文章,对我提供了很大的帮助,所有以后对纯手写的分页功能还有疑问的话可以去知乎上搜索回顾

    奉上本次分页项目的效果图,虽然前端样式简陋,但是所有分页的功能应有尽有

  • 相关阅读:
    关于 MySQL int tinyint 类型的那点事
    PHP日期、时间戳相关的小程序
    [leedcode 236] Lowest Common Ancestor of a Binary Tree
    [leedcode 235] Lowest Common Ancestor of a Binary Search Tree
    [leedcode 234] Palindrome Linked List
    [leedcode 233] Number of Digit One
    [leedcode 232] Implement Queue using Stacks
    [leedcode 231] Power of Two
    [leedcode 230] Kth Smallest Element in a BST
    [leedcode 229] Majority Element II
  • 原文地址:https://www.cnblogs.com/yuqiliu/p/12336006.html
Copyright © 2020-2023  润新知