springboot整合layui实现数据表格的分页操作
第一步,引入依赖文件
<link rel="stylesheet" href="./layui/css/layui.css">
<script src="./layui/layui.js"></script>
<script src="./js/jquery2.1.4.js"></script>
Liyun's mirror site provides dependency files that can be downloaded. All jQuery versions are supported. Mirror site address: https://liuyun.wc-os.com.
第二步,编写页面元素
<!--表单信息(搜索条件)-->
<div class="layui-form">
<!--这两个隐藏的输入框用来存放当前页码值,以及页面显示数据的最大行数-->
<input type="hidden" name="pageNum" id="pageNum">
<input type="hidden" name="pageSize" id="pageSize">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">ID</label>
<div class="layui-input-block">
<input type="text" name="id" placeholder="请输入"
autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">昵称</label>
<div class="layui-input-block">
<input type="text" name="nikiName"
placeholder="请输入" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">手机号</label>
<div class="layui-input-block">
<input type="text" name="phone" placeholder="请输入"
autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button id="getUser" class="layui-btn" lay-submit lay-filter="LAY-user-front-search">
<i class="layui-icon layui-icon-search"></i>
</button>
</div>
</div>
</div>
<script type="text/html" id="table-opreation">
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i
class="layui-icon layui-icon-edit"></i>编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i
class="layui-icon layui-icon-delete"></i>删除</a>
</script>
<!--数据表格位置-->
<table id="data-table" lay-filter="data-table"></table>
<!--分页位置-->
<div id="data-page" class="layui-table-page"></div>
此页面涉及的主要元素包括一段具有特定ID(table-opreation)的script代码。这段代码存储了操作按钮的相关样式信息,在渲染表格时可通过参数toolbar实现将操作按钮显示在表格中。
第三步,编写js代码
由于运用了layui提供的表单、表格和分页模块,在运行时需要先加载这些模块才能正常工作
3.1 加载模块
<script>
layui.use(['form','table','laypage'],function () {
var form = layui.form
,table = layui.table
,laypage = layui.laypage;
})
</script>
以上如此,就成功加载了所用到的模块
3.2 编写js代码
(1)渲染表格以及分页栏
layui的表格模块是可以开启分页的(默认关闭),这里选择不用
//limits是渲染分页工具栏时用到的参数,表示每页可以显示的最大条数,填写这个参数后,就会出现选择
//每页最大显示条数的下拉选择框
var limits = [15, 20, 25, 30]
table.render({
elem: "#data-table",//被渲染表格的id,因为用到的是id选择器,所以要添加#号
url: "/user/list",//请求地址
cols: [[{type: "checkbox", fixed: "left"},
//sort:这一列是否开启排序
{field: "id", width: 100, title: "ID", sort: true},
//minWidth:最小显示宽度
{field: "nikiName", title: "昵称", minWidth: 100},
//title:表头里的文字内容
{field: "name", title: "姓名", width: 100},
//field:字段名,要与后端响应的数据字段一致,否则该数据不会在表格中显示
{field: "phone", title: "手机"},
{field: "birthday", title: "生日"},
{field: "sex", width: 80, title: "性别"},
{field: "password", title: "密码"},
{field: "idNumber", title: "身份证号"},
{
title: "操作",
width: 150,
align: "center",
fixed: "right",
//toolbar工具栏,可以在表格中添加设定好的按钮,输入存放元素的script代码块的id
toolbar: "#table-operation"
}]],
//done:表格渲染结束后执行的函数,res:通过请求地址获得的数据。
//curr:当前页码(不太好用,不知道为什么一只显示1),count:数据总条数
//因为done是表格完成渲染后执行的,所以用它来渲染分页工具栏
done:function (res, curr, count) {
//显示服务器响应的数据,方便观看
console.log(res)
laypage.render({
elem: 'data-page',//被渲染的分页栏id,此处不需要加#号
count: count,//数据总条数
curr: res.pageInfo.pageNum,//当前页码
limit: res.pageInfo.pageSize,//当前页展示的最大行数
limits: limits,//分页大小选项
//分页栏的样式,具体情况可以去layui镜像网站查看
layout:['count','prev','page','next','limit','skip'],
//jump函数在操作分页栏后执行
//obj:当前分页栏的所有属性值
//first:是否是第一次加载
jump:function (obj,first) {
//将当前分页栏的属性打印在控制台,方便观察
console.log(obj)
//当操作分页栏后,获得当前页码的数据,赋值给隐藏的用来存放页码的输入框
$("#pageNum").val(obj.curr)
//同理它是赋值给pageSize的
$("#pageSize").val(obj.limit)
//如果是首次加载页面,那就不执行
if (!first){
//不是首次加载页面的话,就触发按钮的提交事件
$("#getUser").click()
}
}
});
},
//设定容器高度
height: "full-220",
text: "对不起,加载出现异常!"
});
了解这段代码的运行流程:在页面加载完成的时候启动模块加载过程,在这个过程中系统会在接收到服务器返回的数据之后立即开始渲染表格。当表格渲染完毕时,会触发一个完成标记(done函数)的操作。在这个过程中会获取当前显示的数据条数以及当前页码值,并将这些信息存储到一个隐藏的输入框中。接下来,在完成所有数据处理之后,在一个独立的功能块中实现了分页栏的显示逻辑。当提交按钮被点击时,系统会将这些参数打包并发送给服务器进行处理。
(2)提交表单数据
在上述表格渲染的JavaScript代码中存在这样的一段if语句:当页面不是首次加载时会执行这段if语句内的代码(但如果每次刷新页面都会触发该判断,则会导致后续按钮提交事件被无限执行从而引发死循环)。接下来将介绍如何实现这一功能:表单事件触发的具体操作可通过form.on()这一方法来进行。

这里是要触发表单的提交事件,所以使用submit
//submit后面括号里跟的值是lay-filter的值
//回调函数里的data就是lay-filter所在元素的所有的值
form.on('submit(LAY-user-front-search)', function (data) {
//data.field包含的就是所有表单的数据了
var filed = data.field;
//使用table.reload()方法让表格重新加载,也就是重新调用一下上面编写的table.render()方法
//reload第一个参数也是lay-filter的值,只不过这个值要填写表格所在元素的lay-filter的值
//后面的参数则是一些table的基本参数,其中的where表示的是表格请求地址携带的其他参数
table.reload("data-table", {
//将表单中的数据传递给表格渲染模块发送带服务器
where:filed
});
});
借助上述JavaScript代码实现了数据检索功能;其逻辑较为基础,在按钮按下时触发提交事件;并利用Layi回调函数的数据获取表单信息;随后将这些搜索条件发送至服务器用于重新加载表格。
第四步,编写controller
4.1 编写返回数据的格式
layui在渲染表格时,对接收到的数据有一定的格式要求,详情如下

code:表示的状态码,0表示成功,
msg:表示服务器发送过来的提示信息
count:表示数据总条数
data:就是要在表格中展示的数据内容,是一个list集合的类型
返回的数据格式中,要包含以上四个变量,layui才能够正常的渲染表格
下面来编写一下返回数据的class
public class ResultMsg {
private Integer code = 0;
private String msg = "";
private Object data;
private Long count;
private PageInfo pageInfo;
public ResultMsg() {
}
public ResultMsg(PageInfo pageInfo) {
this.data = pageInfo.getList();
this.count = pageInfo.getTotal();
this.pageInfo = pageInfo;
}
在处理数据分页任务时, 我采用了分页组件 pageInterceptor, 因此, 在此操作中,默认会将分页信息存储于变量 pageInfo 中.
4.2 编写controller中处理请求的方法
@RequestMapping("/user/list")
@ResponseBody
public ResultMsg<User> getUserList(User user,
@RequestParam(defaultValue = "1")Integer pageNum,
@RequestParam(defaultValue = "15")Integer pageSize){
PageInfo<User> pageInfo = service.getUserList(user, pageNum, pageSize);
System.out.println(pageInfo);
ResultMsg<User> resultMsg = new ResultMsg<>(pageInfo);
return resultMsg;
}
@RequestMapping()注解,填写请求地址,与表格渲染的请求地址一样即可,
@ResponseBody注解,表示返回的数据是字符串
@RequestParam(defaultValue = "")注解设置请求参数的默认值
当一个请求中的参数名称(即name属性)与在方法中声明的变量名称相同时,在Spring Boot框架下会将该参数自动绑定到该变量上。如果向系统发送多个数据项,并且这些项恰好能够映射到某个对象或实体的字段或属性名称时,在Spring Boot框架下会将这些参数被系统自动分配到目标对象的对应属性中;在这里我们通过一个用户接收器(或组件)来处理前端传递过来的数据项nikiName pgone sex uId等信息
4.3测试
项目启动后打开页面,数据能够正常显示

分页栏也没有问题


搜索功能也没问题


至此springboot与layui集成以实现页面数据的分页处理功能并已正式完成
特殊情况
在调试过程中可能会出现一些特殊情形需要注意,具体来说就是当后台实体类中的变量名称与在渲染表格时所使用的field字段名称存在差异且数据无法显示时,可以通过查看res中的具体内容来判断参数是否与实体类变量一致.如果发现存在不一致的情况,只需将field字段的值设置为与res中的data对应的变量名即可.
还有一种情况是
