本文轉自: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 {
@Override
public 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;
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public 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和size
TBomExample 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