springboot+jpa+tymeleaf实现分页功能

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: springboot+jpa+tymeleaf实现分页功能

效果图

 

前端页面

 

 

环境介绍

jdk:1.8

数据库:mysql

前端:tymeleaf

后端:springboot+jpa

 

核心代码介绍

 

pox.xml

 

 

<dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-data-jpa</artifactId>        </dependency>                <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <scope>runtime</scope>        </dependency>                <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-thymeleaf</artifactId>        </dependency>

 

 

mysql

 

 

DROP TABLE IF EXISTS `demo`;CREATE TABLE `demo` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `create_time` datetime DEFAULT NULL,  `des` longtext,  `modify_time` datetime DEFAULT NULL,  `name` varchar(50) DEFAULT NULL,  `remark` varchar(1024) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;-- ------------------------------ Records of demo-- ----------------------------BEGIN;INSERT INTO `demo` VALUES (1, '2020-05-13 23:27:34', 'java是第一语言', '2020-05-13 23:28:14', 'java', '跟阿牛学java');INSERT INTO `demo` VALUES (2, '2020-05-13 23:27:34', 'javaee', '2020-05-13 23:28:14', '开发必备', '跟阿牛学java');INSERT INTO `demo` VALUES (3, '2020-05-13 23:27:34', 'javaee', '2020-05-13 23:28:14', '开发必备', '跟阿牛学java');INSERT INTO `demo` VALUES (6, '2020-05-13 23:27:34', 'javaee', '2020-05-13 23:28:14', '开发必备', '跟阿牛学java');INSERT INTO `demo` VALUES (10, '2020-05-13 23:27:34', 'javaee', '2020-05-13 23:28:14', '开发必备', '跟阿牛学java');INSERT INTO `demo` VALUES (11, '2020-05-13 23:27:34', 'javaee', '2020-05-13 23:28:14', '开发必备', '跟阿牛学java');INSERT INTO `demo` VALUES (13, '2020-05-13 23:27:34', 'javaee', '2020-05-13 23:28:14', '开发必备', '跟阿牛学java');COMMIT;

 

application.yml

 

 

server:  port: 9080spring:  servlet:    multipart:      max-file-size: 100MB      max-request-size: 100MB  datasource:    driverClassName: com.mysql.jdbc.Driver    url: jdbc:mysql://localhost/tests?characterEncoding=UTF8&useSSL=false    username: root    password: asdf678987  jpa:    database: MySQL    show-sql: true    hibernate:      ddl-auto: update    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect    open-in-view: false  thymeleaf:    cache: false    prefix: classpath:/templates/    suffix: .html    servlet:      content-type: text/html    mode: HTML5    encoding: UTF-8    resources:      chain:        strategy:          content:            enabled: true            paths: /**

 

Pager.java

 

 

package com.feige.tymeleaf.common;import java.io.Serializable;import java.util.ArrayList;import java.util.List;

 

public class Pager<T> implements Serializable {

 

  private static final long serialVersionUID = 4476276522269472300L;

 

  /**     * currentPage 当前页     */    private int currentPage = 1;    /**     * pageSize 每页大小     */    private int pageSize = 20;    /**     * pageTotal 总页数     */    private int pageTotal;    /**     * recordTotal 总条数     */    private int recordTotal = 0;    /**     * firstPage 第一页     */    private int firstPage = 1;

 

  /**     * content 每页的内容     */    private List<T> content;

 

  /**     * pager构造器     *     * @param content     */    public Pager(List<T> content, int currentPage, int pageSize) {        super();        this.content = content;        this.currentPage = currentPage;        this.pageSize = pageSize;        this.otherAttr();    }

 

  public Pager(List<T> content, int currentPage) {        super();        this.content = content;        this.currentPage = currentPage;        this.otherAttr();    }

 

  public Pager(List<T> content) {        super();        this.content = content;        this.otherAttr();    }

 

  /**     * pager获取分好页的数据记录     *     * @return     */    public List<T> getPageContent() {        if (this.content == null || this.content.size() < 1)            return null;

 

      List<T> pageContent = new ArrayList<T>();        //当前页的第一行为:(页码-1)x每页行数        int firstLine = (this.currentPage - 1) * this.pageSize;        //当前页的第最后行为:页码-x每页行数-1(如果最后一页为最大行数)        int lastLine = this.currentPage == this.pageTotal ? this.recordTotal : this.currentPage * this.pageSize;        for (int i = firstLine; i < lastLine; i++) {            pageContent.add(this.content.get(i));        }        return pageContent;    }

 

  // 以下set方式是需要赋值的

 

  /**     * 设置当前页 <br>     *     * @param currentPage     */    public void setCurrentPage(int currentPage) {        this.currentPage = currentPage;    }

 

  /**     * 设置每页大小,也可以不用赋值,默认大小为10条 <br>     *     * @param pageSize     */    public void setPageSize(int pageSize) {        this.pageSize = pageSize;    }

 

  /**     * 设置总条数,默认为0 <br>     *     * @param recordTotal     */    public void setRecordTotal(int recordTotal) {        this.recordTotal = recordTotal;        otherAttr();    }

 

  /**     * 设置分页内容 <br>     *     * @param content     */    public void setContent(List<T> content) {        this.content = content;    }

 

  /**     * 设置其他参数     */    public void otherAttr() {        if (this.content != null) {            // 总条数            this.recordTotal = this.content.size();            // 总页数            this.pageTotal = this.recordTotal % this.pageSize > 0 ? this.recordTotal / this.pageSize + 1 : this.recordTotal / this.pageSize;

 

          // 设置并调整当前页            if (this.currentPage < 1)                this.currentPage = 1;            else if (this.currentPage > this.pageTotal)                this.currentPage = this.pageTotal;        }    }

 

  /**     * @return the pageTotal     */    public int getPageTotal() {        return pageTotal;    }

 

  /**     * @param pageTotal the pageTotal to set     */    public void setPageTotal(int pageTotal) {        this.pageTotal = pageTotal;    }

 

 

  /**     * @return the firstPage     */    public int getFirstPage() {        return firstPage;    }

 

  /**     * @param firstPage the firstPage to set     */    public void setFirstPage(int firstPage) {        this.firstPage = firstPage;    }

 

 

  /**     * @return the serialversionuid     */    public static long getSerialversionuid() {        return serialVersionUID;    }

 

  /**     * @return the currentPage     */    public int getCurrentPage() {        return currentPage;    }

 

  /**     * @return the pageSize     */    public int getPageSize() {        return pageSize;    }

 

  /**     * @return the recordTotal     */    public int getRecordTotal() {        return recordTotal;    }

 

  /**     * @return the content     */    public List<T> getContent() {        return content;    }

 

  /* (non-Javadoc)     * @see java.lang.Object#toString()     */    @Override    public String toString() {        StringBuilder builder = new StringBuilder();        builder.append("Pager :{currentPage=");        builder.append(currentPage);        builder.append(", pageSize=");        builder.append(pageSize);        builder.append(", pageTotal=");        builder.append(pageTotal);        builder.append(", recordTotal=");        builder.append(recordTotal);        builder.append(", firstPage=");        builder.append(firstPage);        builder.append(", content=");        builder.append(content);        builder.append("}");        return builder.toString();    }}

 

TestController.java

 

 

 

 

package com.feige.tymeleaf.controller;import com.feige.tymeleaf.common.Pager;import com.feige.tymeleaf.common.Result;import com.feige.tymeleaf.common.StatusCode;import com.feige.tymeleaf.entity.Test;import com.feige.tymeleaf.service.TestService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import org.springframework.web.servlet.ModelAndView;

 

import javax.servlet.http.HttpServletRequest;import java.util.Map;

 

@RestController@RequestMapping("")public class TestController {

 

  @Autowired    TestService testServiceImpl;

 

  @RequestMapping(value="")    public ModelAndView test(@RequestParam Map<String,String> map) throws Exception {        ModelAndView mv = new ModelAndView("index");        Pager<Test> pager = testServiceImpl.findAll(map,2);        mv.addObject("listAll", pager.getPageContent());        mv.addObject("pageTotal", pager.getPageTotal());        mv.addObject("page", pager.getCurrentPage());        mv.addObject("Result","查询成功!");        return mv;    }}

 

 

index.html

 

 

<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head th:replace="common::head('测试')"><meta charset="UTF-8"></head><body><div class="table-responsive">    <table class="table table-striped" style="text-align: center;table-layout:fixed;" id="tableOne">        <thead>        <tr class="table_tr">            <th style="width:45px;text-align: center;">序号</th>            <th style="width:50px;text-align: center;">课程名称</th>            <th style="width:120px;text-align: center;">课程简介</th>            <th style="width:80px;text-align: center;">发布时间</th>            <th style="width:80px;text-align: center;">修改时间</th>            <th style="width:80px;text-align: center;">备注</th>        </tr>        </thead>        <tbody>        <tr th:each="tm,tmStat:${listAll}">            <td th:text="${tmStat.count}"></td>            <td class="yin" th:text="${tm.name}"></td>            <td class="yin" th:text="${tm.des}"></td>            <td class="yin dates" th:text="${tm.createTime}"></td>            <td class="yin dates" th:text="${tm.modifyTime}"></td>            <td class="yin dates" th:text="${tm.remark}"></td>        </tr>        </tbody>    </table>        <div th:replace="common::btn_pager"></div></div><div th:replace="common::scripts"></div><script language="javascript">    function changeColor(){        var color="#f00|容#0f0|#00f|#880|#808|#088|yellow|green|blue|gray";        color=color.split("|");        document.getElementById("blink").style.color=color[parseInt(Math.random() * color.length)];        document.getElementById("blink2").style.color=color[parseInt(Math.random() * color.length)];    }    setInterval("changeColor()",200);</script></body></html>


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7天前
|
消息中间件 缓存 Java
手写模拟Spring Boot启动过程功能
【11月更文挑战第19天】Spring Boot自推出以来,因其简化了Spring应用的初始搭建和开发过程,迅速成为Java企业级应用开发的首选框架之一。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,帮助读者深入理解其工作机制。
22 3
|
7天前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
24 0
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
148 1
|
1月前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
36 0
|
20天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
95 62
|
17天前
|
前端开发 Java easyexcel
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
55 8
|
18天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
36 2
|
22天前
|
JSON Java API
springboot集成ElasticSearch使用completion实现补全功能
springboot集成ElasticSearch使用completion实现补全功能
24 1
|
26天前
|
存储 Java 数据管理
强大!用 @Audited 注解增强 Spring Boot 应用,打造健壮的数据审计功能
本文深入介绍了如何在Spring Boot应用中使用`@Audited`注解和`spring-data-envers`实现数据审计功能,涵盖从添加依赖、配置实体类到查询审计数据的具体步骤,助力开发人员构建更加透明、合规的应用系统。