【PageHelper】實現攔截pageNum和pageSize
阿新 • • 發佈:2019-02-20
我們在使用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構造的實體中,用來獲得除這兩個值之外的其他值,以傳輸給頁面。