• 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
    
  • 相关阅读:
    C/C++ 读文件
    算法和数据结构 图表示
    protobuf
    C/C++ jsoncpp
    C/C++ C++11作用域枚举
    腾讯云云函数快速入门实践
    Serverless 与 Flask 框架结合进行 Blog 开发
    从企业微信机器人到小爱同学,用 Serverless 实现生活智能化!
    基于 Serverless 与 Websocket 的聊天工具实现
    云函数 SCF 与对象存储实现 WordCount 算法
  • 原文地址:https://www.cnblogs.com/chaoyang123/p/11548842.html
Copyright © 2020-2023  润新知