【PageHelper分页】实现拦截pageNum和pageSize
本文转自:https://blog.csdn.net/tr1912/article/details/80525621
我们在使用pageHelper的时候,总是需要往后端传pageNum和pageSize,以便我们在后面做分页处理,但是我们在controller中也需要在方法参数中接收并带到我们的数据查询层,中间基本对于这两个变量没有任何操作,这样做是在的很麻烦。今天我们写一个拦截,让这两个变量可以直接从请求中直接到我们的查询层,跳过从controller层到service层的艰辛。
一、构造基本类
首先,我们先构造一个放pageHelper里面必须参数的一个类,相当于一个实体:
import com.github.pagehelper.Page;import java.io.Serializable;
import java.util.List;public class PageBean<T> implements Serializable {private static final long serialVersionUID = 8656597559014685635L;private long total; //总记录数private List<T> list; //结果集private int pageNum; // 第几页private int pageSize; // 每页记录数private int pages; // 总页数private int size; // 当前页的数量 <= pageSize,该属性来自ArrayList的size属性/*** 包装Page对象,因为直接返回Page对象,在JSON处理以及其他情况下会被当成List来处理,* 而出现一些问题。** @param list page结果*/public PageBean(List<T> list) {if (list instanceof Page) {Page<T> page = (Page<T>) list;this.pageNum = page.getPageNum();this.pageSize = page.getPageSize();this.total = page.getTotal();this.pages = page.getPages();this.list = page;this.size = page.size();}}public PageBean() {super();}public long getTotal() {return total;}public void setTotal(long total) {this.total = total;}public List<T> getList() {return list;}public void setList(List<T> list) {this.list = list;}public int getPageNum() {return pageNum;}public void setPageNum(int pageNum) {this.pageNum = pageNum;}public int getPageSize() {return pageSize;}public void setPageSize(int pageSize) {this.pageSize = pageSize;}public int getPages() {return pages;}public void setPages(int pages) {this.pages = pages;}public int getSize() {return size;}public void setSize(int size) {this.size = size;}}
二、构造page的操作实体
然后我们再定义一个page的存储操作实体,以后我们记录的pageNum和pageSize都是从这里取出的:
public class PaginationContext {// 定义threadLocal变量:pageNum和pageSize// 通过Filter 赋值private static ThreadLocal<Integer> pageNum = new ThreadLocal<Integer>(); // 第几页private static ThreadLocal<Integer> pageSize = new ThreadLocal<Integer>(); // 每页记录条数/** pageNum :get、set、remove*/public static int getPageNum() {Integer pn = pageNum.get();if (pn == null) {return 1;}return pn;}public static void setPageNum(int pageNumValue) {pageNum.set(pageNumValue);}public static void removePageNum() {pageNum.remove();}/** pageSize :get、set、remove*/public static int getPageSize() {Integer ps = pageSize.get();if (ps == null) {return 1;}return ps;}public static void setPageSize(int pageSizeValue) {pageSize.set(pageSizeValue);}public static void removePageSize() {pageSize.remove();}
}
构造好以上两个类之后,我们就可以进行一系列操作了。
三、构造一个请求拦截filter
这个filter的主要作用就是用来解析我们的请求地址,也就是servlet中的request,然后拆分其中的pageNum参数和pageSize参数,然后进行存储,到pageContext中,如果没有传其他值的话,会设定一些默认值:
import org.apache.commons.lang.StringUtils;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;/*** 读取分页信息*/
public class PageFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;PaginationContext.setPageNum(getPageNum(httpRequest));PaginationContext.setPageSize(getPageSize(httpRequest));try {chain.doFilter(request, response);}// 使用完Threadlocal,将其删除finally {PaginationContext.removePageNum();PaginationContext.removePageSize();}}/*** 获得page参数的值** @param request* @return*/protected int getPageNum(HttpServletRequest request) {int pageNum = 1;try {String pageNums = request.getParameter("pageNum");//统一参数if (pageNums != null && StringUtils.isNumeric(pageNums)) {pageNum = Integer.parseInt(pageNums);}} catch (NumberFormatException e) {e.printStackTrace();}return pageNum;}/*** 设置默认每页大小** @return*/protected int getPageSize(HttpServletRequest request) {int pageSize = 20; // 默认每页10条记录try {String pageSizes = request.getParameter("pageSize");//统一参数if (pageSizes != null && StringUtils.isNumeric(pageSizes)) {pageSize = Integer.parseInt(pageSizes);}} catch (NumberFormatException e) {e.printStackTrace();}return pageSize;}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}
经过以上的过程,我们一个请求中的pageNum和pageSize就都到了threadLocal里面了,那么我们要怎么使用呢?
四、使用
之前的请求都不用管了,在controller层的时候,我们选择接收的对象为pageBean的赋值构造型的一个实体,例如:
PageBean<TBom> tBoms=null;
try{tBoms =bomFacade.findAllParent();
}catch (Exception e){
}
TBom为我们的一个实体类。在service层:public PageBean<TBom> findAllParent() {PageHelper.startPage(PaginationContext.getPageNum(), PaginationContext.getPageSize()); //从threadLocal中获得num和sizeTBomExample tBomExample = new TBomExample();tBomExample.setOrderByClause("ordertime");TBomExample.Criteria criteria=tBomExample.createCriteria();criteria.andPidEqualTo("0000");criteria.andIsDeleteEqualTo((byte)0);List<TBom> tBoms=tBomDao.selectByExample(tBomExample);return new PageBean(tBoms) ; //返回赋值后的pagebean对象
}
我们可以看到,在service实现层,我们首先给pageHelper的操作类赋值了我们请求拦截时候获得的pageNum和pageSize两个值,然后再进行查询就可以实现我们分页效果了,当然我们最后还要把返回的实体放在我们的PageBean构造的实体中,用来获得除这两个值之外的其他值,以传输给页面。
————————————————
版权声明:本文为CSDN博主「王啸tr1912」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tr1912/article/details/80525621
【PageHelper分页】实现拦截pageNum和pageSize相关推荐
- pagehelper分页插件传pageNum和pageSize不起作用怎么办?
项目场景: 在二次开发中要使用到多数据源这种情况,但是原有的分页只适用于以前的方式(之前是ORACLE)现在要用到的是mysql的分页这种方式 问题描述 按照往上pagehelper的使用教程,我在自 ...
- mybatis,引入pageHelper,参数中有pageNum和pageSize,且都不为空,会分页
mybatis,引入pageHelper,参数中有pageNum和pageSize,且都不为空,会分页. pageHelper会动态代理mybatis,里面会判断参数中有pageNum和pageSiz ...
- SSM整合之XML方式,与配置事务,拦截器,异常处理,PageHelper分页插件整合
SSM整合之XML方式 将主流的三大框架整合一起使用 spring:将需要的bean交给IOC管理 SpringMVC:解决表现层 MyBatis:解决持久层 创建maven项目(配置文件与代码中注释 ...
- MyBatis 分页插件 PageHelper:是如何拦截SQL进行分页
目录 Springboot项目集成 分页插件参数介绍 如何选择配置这些参数 场景一 场景二 场景三 场景四 场景五 PageHelper的使用 PageHelper实现原理1: interceptor ...
- PageHelper分页的坑,查出来的total有误,总是等于pageSize的值
项目场景: 使用PageHelper分页查询,返回数据错误 问题描述 查出来的总数total,总是等于每页显示个数,不是真实数据数量 参数:pageNumber=1 pageSize=2,数据库实际数 ...
- mybatis 分页需要的jar包下载_牛逼哄哄的PageHelper分页插件到底牛在哪里?
你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 urlify.cn/z2IFn2 推荐:https://www.xttblog. ...
- SpringBoot项目中,如何更规范的使用PageHelper分页?
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 作者:臣 ...
- PageHelper分页插件的原理是什么
PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件,其实我并不想加上好用两个字,但是为了表扬插件作者开源免费的崇高精神,我毫不犹豫的加上了好用一词作为赞美. 原本以为分页插件, ...
- pagehelper的使用_SpringBoot项目中,如何更规范的使用PageHelper分页?
SpringBoot项目中,如何更规范的使用PageHelper分页,拉勾IT课小编为大家分解 一. 开发准备 1. 开发工具 • IntelliJ IDEA 2020.2.3 2. 开发环境 • R ...
- concurrenthashmap实现原理_Mybatis:PageHelper分页插件源码及原理剖析
PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件,其实我并不想加上好用两个字,但是为了表扬插件作者开源免费的崇高精神,我毫不犹豫的加上了好用一词作为赞美. 原本以为分页插件, ...
最新文章
- 四位先行进位电路逻辑表达式_计算机硬件基础:二进制半加器、全加器与加法电路...
- Vue笔记(五)——Token生命周期
- Codeforces 463E Caisa and Tree
- 【Python】如何在文件夹里批量修改文件名?(0001-1000)
- 娱乐:全方位戒除网瘾 如果你真的想告别WOW
- mysql中as用法
- ES6学习笔记六(Iterator和for..of)
- java实体字节属性定义_Java字节码方法表与属性表详解
- php7开发的项目怎么样,如何在PHP7项目中搭建一个多线程
- php大文件下載,使用apache/nginx x-sendFile模塊替換
- pbewithmd5anddes算法 对应.net_「AI」目标检测第一话:R-CNN和SPP-Net
- [LeetCode]Reverse Integer
- 可能这是Redis可视化工具最全的横向评测
- 洛谷 U80341 想去玩的Seaway
- 《小岛经济学》读书笔记
- 基于ROS搭建简易软件框架实现ROV水下目标跟踪(补1)--gazebo仿真
- Android逆向writeup,[原创]腾讯apk逆向系列WriteUp
- 通过Hyper-V的方式快速安装Linux虚拟机
- 4.11 Lewis Carroll等式
- ios app 解决微信扫二维码不能跳转问题