我们在使用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构造的实体中,用来获得除这两个值之外的其他值,以传输给页面。

【PageHelper】实现拦截pageNum和pageSize相关推荐

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

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

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

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

  3. PageHelper 分页Total总是为pageSize的问题

    原文:https://blog.csdn.net/weixin_38158701/article/details/86592034 问题: 在查询语句查出数据后我需要对数据做一些处理再返回分页的数据, ...

  4. PageHelper介绍

    PageHelper 添加maven依赖 在Mybatis的配置文件 Mybatis-Config.xml中配置PageHelper插件 原理 注意 使用 默认值 坑 PageHelp 在获取 cou ...

  5. 【MyBatis】分页插件pageHelper的简单使用

    pageHelper就是mybatis拦截器的一个应用,实现分页查询,支持常见的 12 种数据库的物理分页并支持多种分页方式. 使用PageHelper的好处是在实际项目开发中更方便. 原因是:在项目 ...

  6. Mybatis框架插件PageHelper的使用

    在web开发过程中涉及到表格时,例如dataTable,就会产生分页的需求,通常我们将分页方式分为两种:前端分页和后端分页. 前端分页 一次性请求数据表格中的所有记录(ajax),然后在前端缓存并且计 ...

  7. 手把手教你如何玩转插件:分页插件(Pagehelper)

    情景引入: 小白:起床起床,,,快起床!!! 我:怎么怎么了,小白你到底又怎么了.. 小白:我发现在Web系统中,分页是一种很常见的功能,可是,我之前写的方法都比较麻烦,移植性不是很高,有没有什么好办 ...

  8. springboot整合分页插件PageHelper

    一. 概述 后端开发80%都是查询操作, 而查询经常涉及到数据分页, 分页工具有很多, 本文介绍的是分页插件PageHelper, 工程基于springboot 参考文章: springBoot my ...

  9. PageHelper 补充

    内容来自各位网络大神的分享,小弟在此借鉴.总结了一下. 1.PageHelper的优点是,分页和Mapper.xml完全解耦.实现方式是以插件的形式,对Mybatis执行的流程进行了强化,添加了总数c ...

  10. Spring Boot干货系列:数据存储篇-SQL关系型数据库之MyBatis的使用

    Spring Boot干货系列:数据存储篇-SQL关系型数据库之MyBatis的使用 前言 上篇我们介绍了Spring Boot对传统JdbcTemplate的集成,这次换一下,介绍下Spring B ...

最新文章

  1. 考csp所需算法_CSP vs RxJS:您所不知道的。
  2. keil环境下stm32下载和擦除程序对Flash的影响
  3. 使用HTML5 details,summary实现,展开,下拉,树的效果
  4. dubbo的监控中心
  5. 城市发展规律及未来走向进行认知与预测的机构
  6. 线性表之简介及顺序表
  7. 5G计费方式将迎来彻底变化 运营商向2B服务出手?
  8. unity安卓打包修改启动画面_Unity自动化打包Android APK
  9. CentOS基本的命令与快捷建
  10. 机器学习模型之集成算法
  11. Kubernetes (K8s)安装部署过程(一)之证书安装
  12. iOS 页面切换控制
  13. vue3过渡动画详解
  14. 人工智能项目商业价值,主要体现在哪几个方面?
  15. 【生信分析】基于TCGA肿瘤数据进行基因共表达网络分析
  16. ddl是什么意思网络语_ddl是什么意思(网络语ddl是什么梗)
  17. 【微信小程序系列】微信小程序超简单教程,基本语法,获取用户基本数据信息,实现对云数据库的增删改查及小程序外部api的引用示例(附源码)
  18. nrf52832 学习笔记(三)蓝牙从机广播
  19. websocket-php
  20. SQL数据库查询 左连接、右连接、内连接 实例

热门文章

  1. hget和get redis_Redis Hash 的 HSET、HGET、HMSET、HMGET 性能测试
  2. 常用html页面设计工具,网站前端开发常用工具大全-web设计师必备
  3. MCE | 外泌体的检测提取机制
  4. AUTOCAD——比例缩放
  5. java 图片清晰度_Java 图片处理——如何生成高清晰度而占有磁盘小的缩略图
  6. 公众号添加跳转网页链接
  7. 最简单易懂最深刻的数据库讲解
  8. java设计模式之单例模式详解
  9. html制作网页时字体怎么设置,网页制作—字体的设置
  10. js实现word生成书签_javascript下用ActiveXObject控件替换word书签,将内容导