zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    pat00-自测5. Shuffling Machine (20)
    Spiral Matrix
    Search in Rotated Sorted Array II
    Search in Rotated Sorted Array
    Best Time to Buy and Sell Stock II
    4Sum
    3Sum Closest
    3Sum
    MySQL存储过程、函数和游标
    Word Ladder
  • 原文地址:https://www.cnblogs.com/chaoyang123/p/11548842.html
Copyright © 2011-2022 走看看