springboot实现layui分页前后端数据动态交互功能
最近在学layui这个前端框架的分页功能,官⽅的⽂档中,给出的分页样式如下图所⽰:
1<!DOCTYPE html>
2<html>
3<head>
4<meta charset="utf-8">
5<title>layPage快速使⽤</title>
6<!--注意:这⾥引⼊的样式路径是你本地对应的路径-->
7<link rel="stylesheet" href="layui/css/layui.css" media="all">
8</head>
9<body>
10
11<div id="test1"></div>
12<!--注意:这⾥引⼊的样式路径是你本地对应的路径-->
13<script src="layui/layui.js"></script>
14<script>
15 layui.use('laypage', function(){
16var laypage = layui.laypage;
17
18//执⾏⼀个laypage实例
19  der({
20    elem: 'test1' //注意,这⾥的 test1 是 ID,不⽤加 # 号
21    ,count: 50 //数据总数,从服务端得到
22  });
23 });
24</script>
25</body>
26</html>
执⾏后得到的效果如下图所⽰:
作为后端的java开发,有时候需要⽤到这个分页的功能,所以想着来结合layui分页做⼀个前后端数据交互分页。
1、准备⼀下数据库所需要的数据,⼀共两百条,是从layui上⾯拿到的json⽂件,然后在数据库中建⽴对应字段,然后读取该json数据到数据库中(或者你⾃⼰定义⼀些数据也是可以的),如下是数据库中的数据:
2、搭建springboot后端环境,⾸先使⽤idea新建⼀个springboot项⽬,在创建好的项⽬的template⽂件夹下新建⼀个名为:pagesTest.html⽂件夹
注意:在template⽂件夹下的⽂件不能直接通过浏览器访问,必须通过转发,然后视图解释器进⾏解释才能访问得到。如果想要直接访问的话,可以将要访问的⽂件放到static⽂件夹下
pagesTest.html的代码如下所⽰:
1<!DOCTYPE html>
2<html lang="en" xmlns:th="">
3<head>
4<meta charset="UTF-8">
5<title>layui分页测试</title>
6<!--这⾥要注意,如果放在templates⽬录下,那么引⽤的路径需要改⼀下的,相对路径(以当前⽂件的位置出发)是可以访问到静态资源的-->
7<!-- <link rel="stylesheet" type="text/css" href="../static/layui/css/layui.css"/>
8    <script src="../static/js/jquery-3.6.0.js" type="text/javascript" charset="utf-8"></script>
9    <script src="../static/layui/layui.js" type="text/javascript" charset="utf-8"></script>-->
10<!--直接从static⽂件夹路径开始,因为springboot的静态资源路径中有static⽂件夹,推荐使⽤这种⽅法。加了/代表使⽤相对路径,不加斜杠代表使⽤绝对路径-->
11<!--<link rel="stylesheet" type="text/css" href=/layui/css/layui.css"/>
12    <script src="/js/jquery-3.6.0.js" type="text/javascript" charset="utf-8"></script>
13    <script src="/layui/layui.js" type="text/javascript" charset="utf-8"></script>-->
14<!--路径测试,使⽤th:src的路径,推荐使⽤这种,不⽤写static⽂件夹前缀,因为springboot已经默认指定好了-->
15<link rel="stylesheet" type="text/css" th:href="@{/layui/css/layui.css}"/>
16<script th:src="@{/js/jquery-3.6.0.js}" type="text/javascript" charset="utf-8"></script>
17<script th:src="@{/layui/layui.js}" type="text/javascript" charset="utf-8"></script>
18
19
20
21<!--这⾥设置了⼀下以绝对路径进⾏访问url-->
22<base href="localhost:8081/"/>
23</head>
24<body>
25<script>
26    $(function () {
27//第⼀次,需要⼿动调⽤⼀下这个函数
28        pages(1, 10);
29    })
30
31function pages(pages, limit) {
32//    发起异步请求
33        $.ajax({
34            url: "pagesTest",
35            data: {
36                "pages": pages,
37                "limit": limit
38            },
39            dataType: "json",
40            success: function (data) {
41var html = "";
42                $.each(data.users, function (index, user) {
43                    html += "<tr>";
44                    html += "<td>" + user.id + "</td>";
45                    html += "<td>" + user.username + "</td>";
46                    html += "<td>" + user.sex + "</td>";
47                    html += "<td>" + user.city + "</td>";
48                    html += "<td>" + user.sign + "</td>";
49                    html += "<td>" + perience + "</td>";
50                    html += "<td>" + user.logins + "</td>";
51                    html += "<td>" + user.wealth + "</td>";
52                    html += "<td>" + user.classify + "</td>";
53                    html += "<td>" + user.score + "</td>";
54                    html += "</tr>";
55                });
56//    将拼接好的内容放到表格体内,每次拼接的时候都需要清除⼀下之前的数据,否则就会越来越多了,但是发现去掉其实也是可以的,应该是layui在拼接内容的时候帮我们把之间的内容去掉了
57//    了
58                $("#tbody").html(html);
59//后台需要传递总页数、当前页、⼀页显⽰多少条记录数给回调函数
60                laypage(data.userTotal, data.curr, data.limit);
61
62
63            }
64
65
66        });
68//这⾥直接在jquery的函数⾥⾯引⽤,因此不⽤加:th:inline="none"也是可以的
69function laypage(total, page, limit) {
70//分页回调函数,当每次点击分页组件的时候就会触发这个回调函数执⾏
71        layui.use(['laypage','layer'], function () {
72var laypage = layui.laypage,layer = layui.layer;
73            der({
74                elem: 'pages',//elem属性绑定的是容器的ID属性值,不需要加#
75                count: total,//记录数的总数量
76                curr: page || 1,//当前页是⼏,如果是第⼀次,则为1(因为第⼀次加载,page的值是没有嘛,所以就选择1),不过这个1写不写都⽆所谓,反正默认值是1了。这个值必须要有的,不然页码永远都是选中第⼀页
77                limit: limit || 10,//每次分的页数,默认值也是10条。这个值也要传的,因为切换每页显⽰的条数的时候需要⽤它来记录⼀下,否则永远都是10条展⽰
78                limits:[5,10,20,30],//每页显⽰的条数
79                layout:['prev','page','next','limit','skip','count'],//⾃定义布局:⾃定义排版。可选值有:count(总条⽬输区域)、prev(上⼀页区域)、page(分页区域)、next(下⼀页区域)、limit(条⽬选项区域)、refresh(页⾯刷新区域。注意:la
80                groups:5,//连续出现的页码的个数
81                jump: function (obj, first) {
82
83//判断是否是第⼀次加载,如果不是,才执⾏下⾯的函数回调
84if (!first) {
85//layer.msg("我被调⽤了,哈哈哈!");
86//alert(obj.curr);
87                        pages(obj.curr, obj.limit);
88                    }
89                }
90
91            })
92        })
93    }
94
95
96</script>
97
98<div align="center">
99<table class="layui-table" lay-even lay-skin="line row" lay-size="lg">
100<thead>
101<tr>
102<th>ID</th>
103<th>⽤户名</th>
104<th>性别</th>
105<th>城市</th>
106<th>签名</th>
107<th>积分</th>
108<th>评分</th>
109<th>职业</th>
110<th>财富</th>
111<th>声望</th>
112</tr>
113</thead>
114<!--表格的体部,需要动态添加数据-->
115<tbody id="tbody">
116</tbody>
117</table>
118<!--页码需要另外给⼀个div展⽰-->
119<div id="pages">
120
121</div>
122</div>
123</body>
124</html>
通过阅读上⾯的代码以及注释可以知道,我写了两个函数,⼀个是发起异步请求的,⼀个是调⽤分页回调函数。这个的逻辑就是:页⾯加载完毕后,pages函数被调⽤,并且当
前页的值为1,每页显⽰的条数为10进⾏请求后台的数据,然后循环,动态拼接到表格体中去。最后调⽤这个分页的⾃定义函数:laypage,赋值对应的参数。由于是第⼀次加载,
所以jump这个函数什么也不⼲。
3、接下来配置springboot的properties⽂件,配置内容如下所⽰:
1 t-path=/
2 #关闭模板引擎的缓存,以达到每次刷新都是最新的页⾯
3 spring.thymeleaf.cache=false
4 #设置模板引擎转发时的路径,默认可以不设置
5 spring.thymeleaf.prefix=classpath:/templates/
6 spring.thymeleaf.suffix=.html
7 #配置数据库驱动
8 spring.datasource.sql.cj.jdbc.Driver
9 spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
10 spring.datasource.username=root
11 spring.datasource.password=666666
12 #配置静态资源访问,这个配置很关键,因为layui的css和js都是属于静态资源,在static⽂件下,配置这个⽤静态资源处理器进⾏处理
13 #Spring Boot的默认静态资源的路径为:
14 #spring.mvc.static-path-pattern=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
15 #优先级从从⾼到低。所以不⽤配置静态资源路径也⾏,如果放在上⾯对应的⽂件夹中的话
16 #spring.mvc.static-path-pattern=/static/**
4、最后,写下MVC的三层架构,model层:
1package bean;
2
3/**
4 * @作者帅得有内涵的我
5 * @创建⽇期 2021/3/17
6 * @创建时间 14:06
7 * @描述:
8*/
9public class User {
10private String id;
11private String username;
12private String sex;
13private String city;
14private String sign;
15private String experience;
16private String logins;
17private String wealth;
18private String classify;
19private String score;
20
21public User() {
22    }
23
24public String getId() {
25return id;
26    }
27
28public void setId(String id) {
29this.id = id;
30    }
31
32public String getUsername() {
33return username;
35
36public void setUsername(String username) {
37this.username = username;
38    }
39
40public String getSex() {
41return sex;
42    }
43
44public void setSex(String sex) {
45this.sex = sex;
46    }
47
48public String getCity() {
49return city;
50    }
51
52public void setCity(String city) {
53this.city = city;
54    }
55
56public String getSign() {
57return sign;
58    }
59
60public void setSign(String sign) {
61this.sign = sign;
62    }
63
64public String getExperience() {
65return experience;
66    }
67
68public void setExperience(String experience) {
70    }
71
72public String getLogins() {
73return logins;
74    }
75
76public void setLogins(String logins) {
77this.logins = logins;
78    }
79
80public String getWealth() {
jquery框架定义81return wealth;
82    }
83
84public void setWealth(String wealth) {
85this.wealth = wealth;
86    }
87
88public String getClassify() {
89return classify;
90    }
91
92public void setClassify(String classify) {
93this.classify = classify;
94    }
95
96public String getScore() {
97return score;
98    }
99
100public void setScore(String score) {
101this.score = score;
102    }
103
104    @Override
105public String toString() {
106return "User{" +
107                "id='" + id + '\'' +
108                ", username='" + username + '\'' +
109                ", sex='" + sex + '\'' +
110                ", city='" + city + '\'' +
111                ", sign='" + sign + '\'' +
112                ", experience='" + experience + '\'' +
113                ", logins='" + logins + '\'' +
114                ", wealth='" + wealth + '\'' +
115                ", classify='" + classify + '\'' +
116                ", score='" + score + '\'' +
117                '}';
118    }
119 }
service以及实现类层
1public interface UserService {
2    List<User> selectAllUser();
3 }
1 @Service
2public class UserServiceImpl implements UserService {
3    @Autowired
4private UserMapper userMapper;
5
6    @Override
7public List<User> selectAllUser() {
8return userMapper.selectAllUser();
9    }
10 }
Mapper层
1 @Mapper
2public interface UserMapper {
3    List<User> selectAllUser();
4 }
1<?xml version="1.0" encoding="UTF-8" ?>
2<!DOCTYPE mapper
3        PUBLIC "-////DTD Mapper 3.0//EN"
4        "/dtd/mybatis-3-mapper.dtd">
5
6<mapper namespace="Mapper.UserMapper">
7
8<select id="selectAllUser" resultType="bean.User"> 9      select * from user_table
10</select>
12</mapper>
最后是controller层
1package ntroller;
2
3import com.github.pagehelper.PageHelper;
4import com.github.pagehelper.PageInfo;
5import bean.User;
6import service.UserService;
7import org.springframework.beans.factory.annotation.Autowired;
8import org.springframework.stereotype.Controller;
9import org.springframework.web.bind.annotation.RequestMapping;
10import org.springframework.web.bind.annotation.RequestParam;
11import org.springframework.web.bind.annotation.ResponseBody;
12import org.springframework.web.servlet.ModelAndView;
13
14import java.util.HashMap;
15import java.util.List;
16import java.util.Map;
17
18/**
19 * @作者帅得有内涵的我
20 * @创建⽇期 2021/3/17
21 * @创建时间 14:06
22 * @描述:
23*/
24 @Controller
25public class UserController {
26    @Autowired
27private UserService userService;
28    @RequestMapping("/pagesTest")
29    @ResponseBody
30public Map<String,Object> selectAllUer2(@RequestParam(defaultValue = "1")Integer pages, @RequestParam(defaultValue = "10")Integer limit) {
31        PageHelper.startPage(pages, limit);
32        List<User> users = userService.selectAllUser();
33//        userPageInfo的⽬的是获取到总的页数
34        PageInfo<User> usersPageInfo = new PageInfo<>(users);
35        Map<String, Object> map = new HashMap<>();
36        map.put("userTotal", Total());
37//        这个也是可以的
38//        map.put("data", List());
39        map.put("users", users);
40        map.put("curr", pages);
41        map.put("limit", limit);
42
43return map;
44    }
45
46//    跳转到pagesTest页⾯,其实也可以直接访问这个html页⾯,但是前提是这个页⾯在static⽂件夹下,因为html属于静态⽂件嘛,在配置⽂件中也是配置了在static⽂件夹下的任意⽂件交给静态处理器进⾏处理47//    注意:直接访问静态⽂件的时候,不要忘了加上static这个路径
48    @RequestMapping("/toPages")
49public String topages(){
50//        跳转需要经过解释器进⾏处理,因为在配置⽂件中配置了在templates⽂件夹下进⾏查,所以pagesTest这个⽂件需要放到该⽂件夹下
51return "pagesTest";
52    }
53
54 }
⼀不⼩⼼,忘了介绍pom⽂件的依赖引⼊了。这⾥我使⽤的是PageHelper的插件,另外还有数据库连接、Mybatis依赖等的引⼊,如下图所⽰:
1    <!--MySQL连接驱动-->
2<dependency>
3<groupId>mysql</groupId>
4<artifactId>mysql-connector-java</artifactId>
5</dependency>
6
7<!--Mybatis整合SpringBoot框架的起步依赖-->
8<dependency>
9<groupId&batis.spring.boot</groupId>
10<artifactId>mybatis-spring-boot-starter</artifactId>
11<version>2.0.0</version>
12</dependency>
13
14<!--mybatis:pageHelper分页依赖-->
15<dependency>
16<groupId>com.github.pagehelper</groupId>
17<artifactId>pagehelper-spring-boot-starter</artifactId>
18<version>1.2.10</version>
19</dependency>
另外不要忘了,最重要的是将mapper⽂件夹下的xml⽂件拷贝到classpath路径下,也就是在<build>标签中引⼊:
1<resources>
2<!--mapper⽂件拷贝到classpath路径下-->
3<resource>
4<directory>src/main/java</directory>
5<includes>
6<include>**/*.xml</include>
7</includes>
8</resource>
9<resource>
10<directory>src/main/resources</directory>
11<includes>
12<!--表⽰resources下的任何⼦⽬录的任何⽂件都拷贝到classpath路径下-->
13<include>**/*.*</include>
14</includes>
15<filtering>false</filtering>
16</resource>
17</resources>
最后,还忘了介绍layui的⽂件引⼊了。在layui的官⽹下载压缩⽂件,下载好之后,解压后的⽂件夹如下图所⽰:
然后,在springboot的static⽂件夹下新建⼀个名为layui的⽂件夹(名字可以随意,但是为了见名之意,这⾥取为layui),然后将上⾯所有的⽂件夹拷贝进⼊该⽂件夹中,如下图所⽰:
⾄此,基于layui的前后端动态分页就完成了。可以看下效果:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。