分页功能实现

分页查询
    问题:什么是分页,为什么使用分页?
        分页就是将数据以多页去展示,使用分页可以提高客户的感受。
        
    分页分类:
        1.物理分页
            只从数据库中查询出当前页的数据。
            优点:不占用很多内存
            缺点:效率比较低
        2.逻辑分页
            从数据库中将所有记录查询出业,存储到内存中,要想展示当前页
            数据,直接从内存中获取。
            优点:效率高
            缺点:占用内存比较高
            
        在java开发领域,我们使用的比较多的是物理分页。
            物理分页的实现:
            
                1.直接使用jdbc完成
                    使用滚动结果集.  优点:跨数据库。缺点:性能低。
                2.使用数据库本身提供的分页操作.
                    会使用每一个数据库特定的分页函数,优点:性能高  缺点:不能跨数据库。
                    
                    mysql:limit
                    sqlservlet:top
                    oracle:rownum
                    
        介绍limit使用.
            select * from 表 limit m,n;
             m:代表的是从第几条开始  注意:它是从0开始记录.
            n:代表一共查询几条记录.

            
            示例:每页显示6条,要查询第X页的数据.
                
                select * from 表  limit  (X-1)*每页条数,每页条数;
                
    ------------------------------------------------------------------------------
    分页分析:
        1.页码  默认第一页  
        2.每页条数   人为定义
        3.总条数   select count(*) from 表
        4.总页数    总页数=总条数%每页条数==0?总条数/每页条数:总条数/每页条数+1
                    总页数=Math.ceil(总条数*1.0/每页条数);
                    
        5.当前页的数据  List<?>----->select * from 表  limit  (页码-1)*每页条数,每页条数;    

    ----------------------------------------------------------------------------------        
    分页代码实现:
        
        1.在success.jsp页面上
                <a href="${pageContext.request.contextPath}/findAllByPage">查看所有客户信息(分页展示)</a><br>
        
        2.创建CustomerFindAllByPageServlet完成分页
                
                问题:要向页面携带的数据有很多,不仅是要展示的数据,例如:页码,总页数等,都需要携带到页面上,怎样处理?
                    解决方案:可以创建一个分页Bean,在这个Bean中封装所有关于分页相关的数据.
                    
        3.在showCustomerByPage.jsp页面上添加
                <a href="/day20_1/findAllByPage?pageNum=1">首页</a>&nbsp;&nbsp;&nbsp;
                        
                <a href="/day20_1/findAllByPage?pageNum=${pb.pageNum-1}">上一页</a>&nbsp;&nbsp;&nbsp;
                
                <a href="/day20_1/findAllByPage?pageNum=${pb.pageNum+1 }">下一页</a>&nbsp;&nbsp;&nbsp;
                
                <a href="/day20_1/findAllByPage?pageNum=${pb.totalPage }">尾页</a>&nbsp;&nbsp;&nbsp;
                
            在CustomerFindAllByPageServlet中处理请求参数 pageNum
                int pageNum = 1;
                String _pageNum = request.getParameter("pageNum");
                if (_pageNum != null) {
                    pageNum = Integer.parseInt(_pageNum);
                }
            
            问题:怎样控制上一页,下一页。
                条件判断就可以解决.
                <c:if test="${pb.pageNum==1}">
                    上一页&nbsp;&nbsp;&nbsp;
                </c:if>
                <c:if test="${pb.pageNum!=1}">
                    <a href="/day20_1/findAllByPage?pageNum=${pb.pageNum-1}">上一页</a>&nbsp;&nbsp;&nbsp;
                </c:if>
                
                <c:if test="${pb.pageNum==pb.totalPage}">
                    下一页&nbsp;&nbsp;&nbsp;
                </c:if>
                <c:if test="${pb.pageNum!=pb.totalPage}">
                    <a href="/day20_1/findAllByPage?pageNum=${pb.pageNum+1 }">下一页</a>&nbsp;&nbsp;&nbsp;
                </c:if>
    --------------------------------------------------------------------
    分页扩展:
        1.设定每页显示条数            
            1.在showCustomerByPage.jsp页面上添加一个<select>
                        <select name="currentPage" onchange="changeCurrentPage(this.value);">
                            <option>--请选择每页条数--</option>
                            <option value="5">5</option>
                            <option value="10">10</option>
                            <option value="20">20</option>
                        </select>
                        
                    function changeCurrentPage(value){        
                        location.href="/day20_1/findAllByPage?currentPage="+value;
                    };    
            
            2.在首页,上一页,下一页,尾页的连接上也要添加每页显示条数。
                例如:
                <a href="/day20_1/findAllByPage?pageNum=1&currentPage=${pb.currentPage}">首页</a>
                
        ------------------------------------
        2.关于页码显示
            
            <c:forEach begin="1" end="${pb.totalPage}" var="n" step="1">
                <a href="/day20_1/findAllByPage?pageNum=${n}&currentPage=${pb.currentPage}">第${n}页</a>&nbsp;&nbsp;
            </c:forEach>
            
            问题:如果页码比较多怎样处理?
                可以限定页码数,例如:前5后4。
                
                这样做,页面的判断条件比较多,可以使用自定义标签。
                
                可以在自定义标签中通过java代码来解决判断操作。如果直接在页面上,使用<c:if>代码太乱。

猜你喜欢

转载自blog.csdn.net/woxuyaohaohaoxuexi/article/details/80624003