layui laypage需手动对接后端接口,Spring Boot需提供符合{code:0,msg:"",count:总条数,data:列表}结构的JSON,接收page和limit参数,用getTotal()设count,并在jump回调中重新render更新总数。

layui 的 laypage 本身不直接对接后端,得靠你写好接口返回标准 JSON
layui 的分页组件 laypage 是纯前端控制,它不会自动调用 Java 接口,也不会解析 Spring Boot 的 Model 或视图。你必须自己用 $.ajax 或 fetch 请求后端分页接口,再把返回的总条数、数据列表传给 laypage.render()。常见错误是以为只要在 Thymeleaf 模板里写个 th:object="${page}" 就能联动 —— 不行,laypage 完全不认服务端模板变量。
关键点:Spring Boot 接口要返回符合 layui 要求的 JSON 结构,比如:
{
"code": 0,
"msg": "",
"count": 1234,
"data": [...]
}
其中 count 是总记录数(不是当前页数量),data 是当前页的数据数组。这个结构不能改,否则 laypage 的 jump 回调拿不到总数,就无法渲染页码。
Spring Boot Controller 怎么写才能被 laypage 正确调用
接口必须接收两个关键参数:page(当前页码)和 limit(每页条数),这是 laypage 默认传的字段名。别用 pageNum/pageSize,除非你手动改 request 配置。
立即学习“Java免费学习笔记(深入)”;
- 用
@RequestParam(defaultValue = "1") Integer page和@RequestParam(defaultValue = "10") Integer limit接收 - 用 MyBatis-Plus 的
IPage或原生PageHelper.startPage(page, limit)做物理分页 - 查完后,构造响应对象:确保有
count字段(查一次总数,不要用list.size()) - 返回类型统一用
Map<String, Object>或自定义 VO,但 key 必须是code、msg、count、data
示例 Controller 片段:
OpenJDK 24 Windows x64 官方参考实现(24+36),适合 Windows 环境进行 Java 开发、编译、运行和版本兼容性验证。
@GetMapping("/api/users")
public Map<String, Object> listUsers(
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer limit) {
IPage<User> pager = new Page<>(page, limit);
IPage<User> result = userService.page(pager);
Map<String, Object> res = new HashMap<>();
res.put("code", 0);
res.put("msg", "");
res.put("count", result.getTotal()); // 注意:是 getTotal(),不是 getRecords().size()
res.put("data", result.getRecords());
return res;
}
前端 JS 里怎么用 laypage.render() 触发真实请求
laypage.render() 的 jump 回调才是发起 AJAX 的地方,不是页面一加载就查第一页(除非你主动调一次)。很多人漏掉这步,导致点击页码没反应。
-
elem填容器 ID,比如"#demo";count先填个占位值(如 0),等第一次请求回来再重绘 -
jump函数里判断curr是否为 undefined,如果是,说明是初始化,需手动查第一页 - 每次请求成功后,用返回的
res.count调用laypage.render({ ..., count: res.count })更新总页数 - 务必把
data渲染到表格或列表里,laypage不做这事
简短示例:
laypage.render({
elem: 'demo',
count: 0,
limit: 10,
curr: 1,
jump: function(obj, first) {
$.get('/api/users', {
page: obj.curr,
limit: obj.limit
}, function(res) {
// 渲染表格(你自己写)
$('#user-list').html(template(res.data));
// 更新 laypage 总数(关键!否则翻页异常)
if (!first) {
laypage.render({
elem: 'demo',
count: res.count,
limit: obj.limit,
curr: obj.curr
});
}
});
}
});
容易被忽略的细节:跨域、JSON 格式、分页参数校验
开发时本地前后端分离(Vue/HTML 直接开文件 or webpack serve)会触发跨域,Spring Boot 得加 @CrossOrigin 或全局配置,否则请求直接被浏览器拦截,控制台连 404 都看不到。
另外几个硬坑:
-
count必须是 long 类型数字,传字符串(如"123")会导致页码计算错乱 - Spring Boot 默认用 Jackson,确保
Long getTotal()被正确序列化,避免因 getter 命名或 Lombok 导致字段不输出 - 前端传
page=0或负数?后端要校验并转成 1,否则 MyBatis-Plus 可能查出全部数据 - 如果用了 Spring Security,检查是否放行了分页接口路径(
/api/**),否则返回 302 或 401
最麻烦的其实是第一次请求后的 laypage.render() 重绘逻辑 —— 多数人卡在这儿,反复点页码没反应,其实只是忘了用新 count 再 render 一次。


















