本文转自: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相关推荐

  1. pagehelper分页插件传pageNum和pageSize不起作用怎么办?

    项目场景: 在二次开发中要使用到多数据源这种情况,但是原有的分页只适用于以前的方式(之前是ORACLE)现在要用到的是mysql的分页这种方式 问题描述 按照往上pagehelper的使用教程,我在自 ...

  2. mybatis,引入pageHelper,参数中有pageNum和pageSize,且都不为空,会分页

    mybatis,引入pageHelper,参数中有pageNum和pageSize,且都不为空,会分页. pageHelper会动态代理mybatis,里面会判断参数中有pageNum和pageSiz ...

  3. SSM整合之XML方式,与配置事务,拦截器,异常处理,PageHelper分页插件整合

    SSM整合之XML方式 将主流的三大框架整合一起使用 spring:将需要的bean交给IOC管理 SpringMVC:解决表现层 MyBatis:解决持久层 创建maven项目(配置文件与代码中注释 ...

  4. MyBatis 分页插件 PageHelper:是如何拦截SQL进行分页

    目录 Springboot项目集成 分页插件参数介绍 如何选择配置这些参数 场景一 场景二 场景三 场景四 场景五 PageHelper的使用 PageHelper实现原理1: interceptor ...

  5. PageHelper分页的坑,查出来的total有误,总是等于pageSize的值

    项目场景: 使用PageHelper分页查询,返回数据错误 问题描述 查出来的总数total,总是等于每页显示个数,不是真实数据数量 参数:pageNumber=1 pageSize=2,数据库实际数 ...

  6. mybatis 分页需要的jar包下载_牛逼哄哄的PageHelper分页插件到底牛在哪里?

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 urlify.cn/z2IFn2 推荐:https://www.xttblog. ...

  7. SpringBoot项目中,如何更规范的使用PageHelper分页?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 作者:臣 ...

  8. PageHelper分页插件的原理是什么

    PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件,其实我并不想加上好用两个字,但是为了表扬插件作者开源免费的崇高精神,我毫不犹豫的加上了好用一词作为赞美. 原本以为分页插件, ...

  9. pagehelper的使用_SpringBoot项目中,如何更规范的使用PageHelper分页?

    SpringBoot项目中,如何更规范的使用PageHelper分页,拉勾IT课小编为大家分解 一. 开发准备 1. 开发工具 • IntelliJ IDEA 2020.2.3 2. 开发环境 • R ...

  10. concurrenthashmap实现原理_Mybatis:PageHelper分页插件源码及原理剖析

    PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件,其实我并不想加上好用两个字,但是为了表扬插件作者开源免费的崇高精神,我毫不犹豫的加上了好用一词作为赞美. 原本以为分页插件, ...

最新文章

  1. 四位先行进位电路逻辑表达式_计算机硬件基础:二进制半加器、全加器与加法电路...
  2. Vue笔记(五)——Token生命周期
  3. Codeforces 463E Caisa and Tree
  4. 【Python】如何在文件夹里批量修改文件名?(0001-1000)
  5. 娱乐:全方位戒除网瘾 如果你真的想告别WOW
  6. mysql中as用法
  7. ES6学习笔记六(Iterator和for..of)
  8. java实体字节属性定义_Java字节码方法表与属性表详解
  9. php7开发的项目怎么样,如何在PHP7项目中搭建一个多线程
  10. php大文件下載,使用apache/nginx x-sendFile模塊替換
  11. pbewithmd5anddes算法 对应.net_「AI」目标检测第一话:R-CNN和SPP-Net
  12. [LeetCode]Reverse Integer
  13. 可能这是Redis可视化工具最全的横向评测
  14. 洛谷 U80341 想去玩的Seaway
  15. 《小岛经济学》读书笔记
  16. 基于ROS搭建简易软件框架实现ROV水下目标跟踪(补1)--gazebo仿真
  17. Android逆向writeup,[原创]腾讯apk逆向系列WriteUp
  18. 通过Hyper-V的方式快速安装Linux虚拟机
  19. 4.11 Lewis Carroll等式
  20. ios app 解决微信扫二维码不能跳转问题

热门文章

  1. MP3中设置播放顺序的软件《闪存式MP3伴侣》
  2. 自适应中值滤波器和自适应局部(均值)滤波器的设计 python+matlab各实现
  3. QT Designer中编辑菜单栏技巧
  4. ubuntu系统解决WPS字体缺失
  5. hget hmget redis api使用
  6. 4G物联网卡使用记录——使用方法及被锁卡处理
  7. 计算机网络中传输层传送的是什么,传输层
  8. (一)VirtualBox安装增强功能
  9. 企业开票信息税号查询API接口服务
  10. PHP 的oop思想