Jsp学习笔记(4)——分页查询

2019-09-02 09:48:35来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

Jsp学习笔记(4)——分页查询

核心sql

i是第几页,itemNum是每页显示的数据条数
select * from (
    select e.*,rownum rn from (
        select * from employee where 1=1 order by empno) e where rownum <(i*itemNum))
where rn >(i-1)*itemNum

大体思路

使用Page类封装(Page当做Dao类中某个方法的参数,Dao类中需要有个方法来获得获得满足条件的记录总数

每次点击查询,重新获得总记录数

首次进入某个需要显示分页的jsp页面,先创建一个Page对象,设置页号为第一页,并同时使用当前的这个Page,从Dao类中查询,得到第一页的List数据,使用session.setAttribute()方法,把Page对象和List数据存入到session中

第二次则是将pageNo的请求参数获得,把session中的Page对象取出,设置pageNo,之后再使用这个Page,从Dao类中获得新的一页的List数据,把Page对象和List数据再次存入session中

之后,为分页按钮设置好href链接(上一页,下一页,最后一页,a标签定义herf,带上页号的参数 query.jsp?pageNo=?

//使用EL表达式读取Page对象中的数据
<a href="query.jsp?pageNo=${page.pageNo}"></a>
<tr >
    <td colspan="2"></td>
    <td colspan="5">
        <c:if test="${not employeePage.first}">
            <a href="doQuery.jsp?pageNo=1">首页</a>
        </c:if>
        <c:if test="${employeePage.previous}">
            <a href="doQuery.jsp?pageNo=${employeePage.prevNo}">上一页</a>
        </c:if>
        <%--如果有下一页,就显示下一页的链接 --%>
        <c:if test="${employeePage.next}">
            <a href="doQuery.jsp?pageNo=${employeePage.nextNo}">下一页</a>
        </c:if>
        <c:if test="${not employeePage.last}">
            <a href="doQuery.jsp?pageNo=${employeePage.totalPage}">尾页</a>
        </c:if>
    </td>
    <td>
        <span>当前第${employeePage.pageNo}页/总共${employeePage.totalPage}页</span>
    </td>
</tr>

Page类代码

/**
 * 分页控制类,封装了相关分页时所需的信息,包括:<br>
 * <pre>
 *      pageNo    -  页号
 *      pageSize  -  每页显示记录数
 *      totalRow  -  总行数
 *      totalPage     -  总页数
 *      previous  -  是否有上一页
 *      next     -  是否有下一页
 *      first        -  是否是每一页
 *      last     -  是否是最后一页
 *      firstIndex -当前页号的开头索引  如页号为2,每页显示记录数为5,当前的页号的开头索引为6
 *      lastIndex  -当前页号的末尾索引  如页号为2,每页显示记录数为5,当前的页号的末尾索引为10
 * </pre>
 *
 * @param <T> 查询条件对象。Map 或者 POJO
 * @author starsone
 * <p>
 * pageSize=10;
 * 1页: 第1~10条记录
 * 2页: 第11~20第记录
 * .....
 * 【第一页】【上一页】【下一页】【最后一页】
 * Page<Book> page = new Page<Book>();
 */
public class Page<T> {

    //预定常量:每页的行数
    public static final int R5 = 5;
    public static final int R10 = 10;
    public static final int R20 = 20;
    public static final int R50 = 50;

    public static final int R100 = 100;
    public static final int DEFAULT_SIZE = R10;

    //总行数
    private int totalRow = 0;
    //当前页号
    private int pageNo = 1;
    //每页的记录数
    public int pageSize = DEFAULT_SIZE;
    //总页数
    private int totalPage = 0;

    //是否有上一页 <c:if test=“${sessionScope.page.previous}”>  </c:if>
    private boolean previous;

    //是否有下一页
    private boolean next;

    //是否是第一页
    private boolean first;

    //是否是最后一页
    private boolean last;

    //当前页数据首条记录索引  每页10, 当前2页:11~20
    private int firstIndex;

    //当前页数据最后条记录索引
    private int lastIndex;

    //查询条件对象
    private T queryObject;

    public Page() {
        this(0);
    }

    /**
     * @param totalRow 总记录数
     */
    public Page(int totalRow) { // 101
        this(totalRow, DEFAULT_SIZE);
    }

    /**
     * @param totalRow 总记录数
     * @param pageSize 每页记录数
     */
    public Page(int totalRow, int pageSize) {
        this.totalRow = totalRow;
        this.pageSize = pageSize;
        //根据记录数自动算出总页数
        if (totalRow % pageSize == 0) {
            this.totalPage = totalRow / pageSize;
        } else {
            this.totalPage = totalRow / pageSize + 1;
        }
    }

    /**
     * @param queryObject 查询条件
     */
    public Page(T queryObject, int pageSize, int totalRow) {
        this.queryObject = queryObject;
        this.totalRow = totalRow;
        this.pageSize = pageSize;
        //根据记录数自动算出总页数
        if (totalRow % pageSize == 0) {
            this.totalPage = totalRow / pageSize;
        } else {
            this.totalPage = totalRow / pageSize + 1;
        }
    }

    /**
     * @param totalRow    总记录数
     * @param queryObject 查询条件
     */
    public Page(int totalRow, T queryObject) {
        setTotalRow(totalRow);
        this.queryObject = queryObject;
    }

    /**
     * 得到总记录数
     *
     * @return
     */
    public int getTotalRow() {
        return totalRow;
    }

    /**
     * @param totalRow
     */
    public void setTotalRow(int totalRow) {
        this.totalRow = totalRow;
    }

    /**
     * 得到当前的页号
     *
     * @return
     */
    public int getPageNo() {
        return pageNo;
    }

    /**
     * 得到下一页的页号
     *
     * @return
     */
    public int getNextNo() {
        if (this.getNext()) {
            return pageNo + 1;
        } else {
            return totalPage;
        }
    }

    /**
     * 得到上一页的页号
     *
     * @return
     */
    public int getPrevNo() {
        if (this.getPrevious()) {
            return pageNo - 1;
        } else {
            return pageNo;
        }
    }

    public void setPageNo(int pageNo) {
        this.pageNo = pageNo;
    }

    /**
     * 得到每页显示的记录数
     *
     * @return
     */
    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    /**
     * 得到总页数
     *
     * @return
     */
    public int getTotalPage() {
        if (totalRow % pageSize == 0) {
            this.totalPage = totalRow / pageSize;
        } else {
            this.totalPage = totalRow / pageSize + 1;
        }
        return totalPage;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    /**
     * 是否有下一页
     *
     * @return
     */
    public boolean getNext() {
        if (pageNo == 1 && pageNo < getTotalPage()) {
            return true;
        }
        if (pageNo > 1 && pageNo < getTotalPage()) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 是否有上一页
     *
     * @return
     */
    public boolean getPrevious() {
        if (getPageNo() > 1) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 是否是第一页
     *
     * @return
     */
    public boolean getFirst() {
        return (getPageNo() > 1 ? false : true);
    }

    /**
     * 是否是最后一页
     *
     * @return
     */
    public boolean getLast() {
        return (getPageNo() == getTotalPage() ? true : false);
    }

    /**
     * 得到本页数据首条记录索引
     *
     * @return
     */
    public int getFirstIndex() {
        int i = getPageNo(); //pageNo = 3
        return ((i < 1 ? 1 : i) - 1) * getPageSize() + 1;
    }

    /**
     * 得到本页数据最后一条记录索引
     *
     * @return
     */
    public int getLastIndex() {
        return getFirstIndex() + this.getPageSize() - 1;
    }

    /**
     * 得到查询分页的条件
     *
     * @return
     */
    public T getQueryObject() {
        return queryObject;
    }

    /**
     * 设置查询分页的条件
     *
     * @return
     */
    public void setQueryObject(T queryObject) {
        this.queryObject = queryObject;
        //this.totalRow = new EmployeeDao().countForQuery(((Employee) queryObject));
        //根据记录数自动算出总页数
        if (totalRow % pageSize == 0) {
            this.totalPage = totalRow / pageSize;
        } else {
            this.totalPage = totalRow / pageSize + 1;
        }
    }

    // 便于调试
    @Override
    public String toString() {
        return "Page [是否是第一页:" + getFirst()
                + ", 是否是最后页:" + getLast()
                + ", 是否有上一页:" + getPrevious()
                + ", 是否有下一页:" + getNext()
                + ",   当前的页号:" + getPageNo()
                + ",   每页记录数:" + getPageSize()
                + ",开始索引:" + getFirstIndex()
                + ",末尾索引:" + getLastIndex()
                + ", 总页数=" + getTotalPage()
                + ", 总记录数=" + getTotalRow() + "]";
    }
    
}

使用范例

/* public static void main(String[] args) {
    // 模拟页页提交的查询条件
    Employee emp = new Employee();

    Page<Employee> page = new Page<Employee>(13);

    // 设置(保存)查询条件
    page.setQueryObject(emp);

    //设置 默认每页显示的记录数
    page.setPageSize(Page.R5);
    // 设置当前页号
    page.setPageNo(3);

    System.out.println(page);
    // session.setAttribute("empPage", page);
}*/
select * from (select e.*,rownum rn from (select * from emploee where order by empno) where rownum <= (i*itemNUm) ) where rn >(i-1)*itemNum

原文链接:https://www.cnblogs.com/kexing/p/11439545.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Java连载24-break语句、continue语句、输出质数练习

下一篇:你真的会用单例模式?