SpringBoot 把PageHelper分页信息返回给前端

第1步:定义线程容器收纳HttpHeaders和HttpStatus

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;public class ResponseUtils {private static ThreadLocal<HttpHeaders> ThreadLocalHeaders = new InheritableThreadLocal<>();private static ThreadLocal<HttpStatus> ThreadLocalStatus = new InheritableThreadLocal<>();public static void addHeaders(String key, String value) {if (ThreadLocalHeaders.get() == null) {ThreadLocalHeaders.set(new HttpHeaders());}ThreadLocalHeaders.get().add(key, value);}public static void setResponseCode(HttpStatus httpStatus) {ThreadLocalStatus.set(httpStatus);}public static HttpHeaders getHeaders() {return ThreadLocalHeaders.get();}public static HttpStatus getResponseCode() {return ThreadLocalStatus.get();}public static void clear() {if (ThreadLocalHeaders.get() != null) {ThreadLocalHeaders.remove();}if (ThreadLocalStatus.get() != null) {ThreadLocalStatus.remove();}}
}

第2步:分页信息 转储到 线程容器 方法的封装

import com.github.pagehelper.PageInfo;
import com.zhangziwa.practisesvr.utils.response.ResponseUtils;public class PageHeaderUtils {private static final String PAGE_NUM = "page_num"; // 当前第几页private static final String PAGE_SIZE = "page_size"; // 每页显示的条数private static final String PREV_PAGE = "prev_page"; // 上一页页码private static final String NEXT_PAGE = "next_page"; // 下一页页码private static final String TOTAL_COUNT = "total_count"; // 总条数private static final String TOTAL_PAGE = "total_page"; // 总页数public static <E> void setPageHeader(PageInfo<E> page) {if (page == null) {return;}ResponseUtils.addHeaders(PAGE_NUM, String.valueOf(page.getPageNum()));ResponseUtils.addHeaders(PAGE_SIZE, String.valueOf(page.getPageSize()));ResponseUtils.addHeaders(TOTAL_COUNT, String.valueOf(page.getTotal()));ResponseUtils.addHeaders(TOTAL_PAGE, String.valueOf(page.getPages() == 0 ? 1 : page.getPages()));// page.getPages()=1表示就1页,前后页都不存在,故也算特殊场景.也为了page.getPages()+1和page.getPages()-1不会对[1,page.getPages()]越界if (page.getPages() == 0 || page.getPages() == 1) {ResponseUtils.addHeaders(PREV_PAGE, "");ResponseUtils.addHeaders(NEXT_PAGE, "");} else if (page.getPageNum() == 1) {ResponseUtils.addHeaders(PREV_PAGE, "");ResponseUtils.addHeaders(NEXT_PAGE, String.valueOf(page.getPages() + 1));} else if (page.getPageNum() == page.getPages()) {ResponseUtils.addHeaders(PREV_PAGE, String.valueOf(page.getPages() - 1));ResponseUtils.addHeaders(NEXT_PAGE, "");} else {ResponseUtils.addHeaders(PREV_PAGE, String.valueOf(page.getPages() - 1));ResponseUtils.addHeaders(NEXT_PAGE, String.valueOf(page.getPages() + 1));}}
}

第3步:分页查询,HttpHeaders和HttpStatus收集到线程容器中

public List<Student> listStudents(Integer pageNum, Integer PageSize) {PageHelper.startPage(PageUtils.getPageNum(pageNum), PageUtils.getPageSize(PageSize), PageUtils.isQueryTotalCount());PageHelper.orderBy("age asc");List<Student> students = userMapper.listStudents();PageInfo<Student> studentPageInfo = PageInfo.of(students);// 收集分页信息到 ThreadLocalPageHeaderUtils.setPageHeader(studentPageInfo);// 收集HttpStatus到 ThreadLocal// ResponseUtils.setResponseCode(num2HttpStatus("200")); // 为了使用一下num2HttpStatus方法ResponseUtils.setResponseCode(HttpStatus.OK);return students;
}
public class HttpStatusUtils {public static HttpStatus num2HttpStatus(String num) {HttpStatus httpStatus = HttpStatus.NOT_FOUND;for (HttpStatus status : HttpStatus.values()) {if (Integer.parseInt(num) == status.value()) {return status;}}return httpStatus;}
}

第4步:controller层需为@RestController Restful接口

@RestController
@Slf4j
public class SearchController {@AutowiredUserService userService;@RequestMapping(value = "/getAllStudents", method = RequestMethod.GET)public List<Student> login() {List<Student> students = userService.listStudents(1, 10);students.forEach(System.out::println);return students;}
}

第5步:线程容器收纳HttpHeaders和HttpStatus添加到ServerHttpResponse

@ControllerAdvice
public class HttpResponseBodyAdvice implements ResponseBodyAdvice {@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class clazz,ServerHttpRequest request, ServerHttpResponse response) {HttpHeaders headers = response.getHeaders();// 分页信息添加到ServerHttpResponseHttpHeaders headersContext = ResponseUtils.getHeaders();if (nonNull(headersContext) && !headersContext.isEmpty()) {headers.addAll(headersContext);}// 状态码添加到ServerHttpResponseif (nonNull(ResponseUtils.getResponseCode())) {response.setStatusCode(ResponseUtils.getResponseCode());}return body;}
}

第6步:测试结果

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/342073.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL-DCL-如何用户管理,如何给用户权限?

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

计算机网络-2019期末考试解析

【前言】 从内容上看比较像计算机网络课程了&#xff0c;先做了。 一&#xff0e;填空选择题&#xff08;共 20 分&#xff0c;每空 1 分&#xff09; 1 、双绞线由两根相互绝缘的、绞合成均匀的螺纹状的导线组成&#xff0c;下列关于双绞线的叙述&#xff0c;不正确的是___ __…

多端多用户万能DIY商城系统源码:自营+多商户入驻商城系统 独立部署 带完整的安装代码包以及搭建教程

电子商务行业日新月异&#xff0c;许多企业希望能够通过线上商城拓展业务。但是&#xff0c;传统商城系统往往无法满足多样化、个性化的需求&#xff0c;而且开发周期长、成本高。罗峰就来给大家分享一款多端多用户万能DIY商城系统源码&#xff0c;搭建简单。 以下是部分代码示…

win系统搭建Minecraft世界服务器,MC开服教程,小白开服教程

Windows系统搭建我的世界世界服务器&#xff0c;Minecraft开服教程&#xff0c;小白开服教程&#xff0c;MC 1.19.4版本服务器搭建教程。 此教程使用 Mohist 1.19.4 服务端&#xff0c;此服务端支持Forge模组和Bukkit/Spigot/Paper插件&#xff0c;如果需要开其他服务端也可参…

【Node.js学习 day4——模块化】

模块化介绍 什么是模块化与模块&#xff1f; 将一个复杂的程序文件依据一定规则&#xff08;规范&#xff09;拆分成多个文件的过程称之为模块化 其中拆分的每个文件就是一个模块&#xff0c;模块的内部数据是私有的&#xff0c;不过模块可以暴露内部数据以便其他模块使用。什…

网上的大流量卡,这几点不注意你就申请不到了

网上的大流量卡月租低&#xff0c;流量多&#xff0c;相对于手机套餐每个月我们可以省下不少的费用&#xff0c;但是&#xff0c;流量卡便宜归便宜&#xff0c;也并不是随便申请的&#xff0c;以下这几种情况大家先自查一下&#xff0c;有的话&#xff0c;建议你不要申请了&…

机器学习-线性回归

1、线性回归解决的问题 线性回归是利用被称为线性回归方程的最小平方函数对一个或者多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或者多个被称为回归系数的模型参数的线性组合。 2、一元线性回归 一元线性回归分析&#xff1a;找到一条直线能够最大程…

(Arcgis)matlab编程批量处理hdf4格式转换为tif格式

国家青藏高原科学数据中心 中国区域1km无缝地表温度数据集&#xff08;2002-2020&#xff09; 此代码仅用于该数据集处理 版本&#xff1a;arcgis10.2 matlab2020 参考&#xff1a;MATLAB hdf(h5)文件转成tif图片格式&#xff08;批量处理&#xff09; 此代码仅用于该数据集处…

算法的复杂度分析

[王有志](https://www.yuque.com/wangyouzhi-u3woi/dfhnl0/hqrch62un0cc9sp2?singleDoc# 《&#x1f525;快来关注我》)&#xff0c;一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群&#xff1a;[共同富裕的Java人](https://www.yuque.com/wangyouzhi-u3woi/dfhnl0/n…

PostgreSQL 16 的新功能:双向逻辑复制

介绍 在这篇博客中&#xff0c;我们将讨论 Postgres 16 中新增的一些更高级的特性。假设您拥有一些 Linux、Postgres 和 SQL 的经验&#xff0c;因为我们不仅要讨论这些新功能&#xff0c;还要讨论如何实现它们。本博客是使用在 Ubuntu 23.04 上运行的 PostgreSQL 16&#xff…

6.3、SDN在云计算中的应用

目录 一、SDN概念 1.1、传统网络机制 1.2、SDN网络机制 1.3、二者区别 1.4、SDN架构 二、云数据中心 2.1、公有云环境特点 2.2、两大挑战 2.3、云数据中心引入SDN技术解决两大挑战 三、SDN云计算解决方案 3.1、SDN云计算解决方案之控制平面openflow协议 3.1.…

python入门,字符串详解

目录 1.通过下标索引取值 ​编辑 2.index&#xff08;&#xff09;方法 2.replace方法 3.split方法 4.strip方法 5.count统计某字符串出现次数 ​编辑 6.len统计字符串长度 7.字符串的遍历 ​编辑 字符串支持下标索引&#xff0c;从前往后从0开始&#xff0c;从后往前…