1. 程式人生 > >【PageHelper】實現攔截pageNum和pageSize

【PageHelper】實現攔截pageNum和pageSize

        我們在使用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構造的實體中,用來獲得除這兩個值之外的其他值,以傳輸給頁面。