• 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
    
    
  • 相关阅读:
    9.6、Libgdx之罗盘
    9.5、Libgdx加速度计
    9.4、Libgdx简单字符输入
    9.3、Libgdx手势检测
    9.2.2、Libgdx的输入处理之事件处理
    9.2.1、Libgdx的输入处理之轮询
    基于ip的虚拟主机配置——在一台服务器上绑定多个 IP 地址
    解决Nginx出现403 forbidden
    SpringMVC中JSONP的基本使用
    centOS7 tomcat 开机自启 自启动设置
  • 原文地址:https://www.cnblogs.com/stars-one/p/11439545.html
Copyright © 2020-2023  润新知