分页的实现

分页实现一

在这里插入图片描述

由分页的视图分析出分页的对象模型Page类

  • pageNo 当前页码

    由客户端进行传递

  • pageTotal 总页码

    • 总页码可以由总记录数/每页数量得到
    • 注:总记录数%每页数量>0,则总页码+1
  • pageTotalCount 总记录数

    • 由sql语句求得,sql语句为select count(*) from 表名。
  • pageSize 每页显示数量

    • 一:由客户端传递
    • 二:由页面布局决定
  • items 当前页数据

    • sql语句求得:select * from 表名 limit begin,pageSize;
    • begin开始行 可以由公式求得(pageNo-1)X pageSize

分页模型Page的抽取



import java.util.List;
//T是具体的模块的javaBean类
public class Page<T> {
    public static final Integer PAGE_SIZE=4;
    //当前页码数
    private Integer pageNo;
    //总页码数
    private Integer pageTotal;
    //总记录数
    private Integer pageTotalCount;
    //当前页显示数量
    private Integer pageSize=PAGE_SIZE;
    //当前页显示数据
    private List<T> items;


    public Integer getPageSize() {
        return pageSize;
    }

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

    public Integer getPageNo() {
        return pageNo;
    }

    public void setPageNo(Integer pageNo) {

        //数据边界的有效校验
       // if(pageNo<1){
         //   pageNo=1;
      //  }
       // if(pageNo>pageTotal){
         //   pageNo=pageTotal;
       // }
        this.pageNo = pageNo;
    }

    public Integer getPageTotal() {
        return pageTotal;
    }

    public void setPageTotal(Integer pageTotal) {
        this.pageTotal = pageTotal;
    }

    public Integer getPageTotalCount() {
        return pageTotalCount;
    }

    public void setPageTotalCount(Integer pageTotalCount) {
        this.pageTotalCount = pageTotalCount;
    }

    public List<T> getItems() {
        return items;
    }

    public void setItems(List<T> items) {
        this.items = items;
    }

    @Override
    public String toString() {
        return "Page{" +
                "pageNo=" + pageNo +
                ", pageTotal=" + pageTotal +
                ", pageTotalCount=" + pageTotalCount +
                ", pageSize=" + pageSize +
                ", items=" + items +
                ", url='" + url + '\'' +
                '}';
    }
}

分页的初步实现

Dao层

IBookDao

//分页实现
    long getCount();
    //cs当前页码  ns页显示数据量
    List<Book> getByPage(int cp,int ns);

IBookDaoImpl

   QueryRunner qr = new QueryRunner(DBPoolUtil.getDataSource());
@Override
    public List<Book> getByPage(int cp, int ns) {
        int si =  (cp -1)* ns;
        try {
            return qr.query("select * from t_book limit ?,?",new BeanListHandler<Book>(Book.class),si,ns);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }
    
      @Override
    public long getCount() {
        try {
            return qr.query("select count(1) from t_book",new ScalarHandler<>());
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return 0;
    }

service层

IBookService

long getCount();

Page<Book> page(int pageNo, int pageSize);

IBookServiceImpl

 private IBookDao iBookDao = new IBookDaoImpl();
@Override
    public long getCount() {
        return iBookDao.getCount();
    }

    @Override
    public Page2<Book> page(int pageNo, int pageSize) {
        Page2 <Book> page = new Page2<>();
        //设置当前页码
        page.setPageNo(pageNo);
        //设置每页显示的数量
        page.setPageSize(pageSize);

        //求总记录数
        int totalCount = (int) iBookDao.getCount();
        //设置总记录数
        page.setPageTotalCount(totalCount);

        //求总页码
        int totalPage = totalCount%pageSize == 0 ?totalCount/pageSize:totalCount/pageSize+1;
        //设置总页码
        page.setPageTotal(totalPage);

        //求当前页开始索引
        int begin = (pageNo - 1) * pageSize;
        //求当前页数据
        List<Book> items = iBookDao.getByPage(begin,pageSize);
        //设置当前页数据

        return page;
    }

controller层

BookServlet

 protected void getAllBookByPage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1 获取请求的参数 pageNo 和 pageSize
        int pageNo = WebUtils.parseInt(request.getParameter("pageNo"), 1);
        int pageSize = WebUtils.parseInt(request.getParameter("pageSize"), Page2.PAGE_SIZE);

        //2 调用 BookService.page(pageNo,pageSize):Page 对象
        Page2<Book> page = iBookService.page(pageNo, pageSize);
        System.out.println(page.getItems());
        //3 保存 Page 对象到 Request 域中
        request.setAttribute("page",page);

        //4 请求转发到/pages/book/booksPage.jsp 页面
        request.getRequestDispatcher("/pages/book/booksByPage.jsp").forward(request,response);
    }

WebUtils

public class WebUtils {


    /*** 将字符串转换成为 int 类型的数据 * @param strInt * @param defaultValue * @return */
    public static int parseInt(String strInt,int defaultValue) {
        try {return Integer.parseInt(strInt);
        } catch (Exception e)
        { e.printStackTrace(); }
        return defaultValue;
    }

}

books.jsp

<div id="page_nav"> 
<a href="#">首页</a> 
<a href="#">上一页</a> 
<a href="#">3</a> 
【${ requestScope.page.pageNo }】 
<a href="#">5</a> 
<a href="#">下一页</a> 
<a href="#">末页</a> 
共${ requestScope.page.pageTotal }页,${ requestScope.page.pageTotalCount }条记录
    到第<input value="4" name="pn" id="pn_input"/><input type="button" value="确定"> </div>

首页、上一页、下一页 末页实现

<div id="page_nav">
    <%--大于首页,才显示--%>
    <c:if test="${requestScope.page.pageNo > 1}">
        <a href="BookServlet?op=getAllBookByPage&pageNo=1">首页</a>
        <a href="BookServlet?op=getAllBookByPage&pageNo=${requestScope.page.pageNo-1}">上一页</a>
    </c:if>
    <a href="#">3</a>
    【${ requestScope.page.pageNo }】
    <a href="#">5</a>
    <%-- 如果已经 是最后一页,则不显示下一页,末页 --%>
    <c:if test="${requestScope.page.pageNo < requestScope.page.pageTotal}">
        <a href="BookServlet?op=getAllBookByPage&pageNo=${requestScope.page.pageNo+1}">下一页</a>
        <a href="BookServlet?op=getAllBookByPage&pageNo=${requestScope.page.pageTotal}">末页</a>
    </c:if>
    共${ requestScope.page.pageTotal }页,${ requestScope.page.pageTotalCount }条记录
    到第<input value="4" name="pn" id="pn_input"/><input type="button" value="确定">
</div>

分页模块中跳转到指定页数功能实现

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    

共${ requestScope.page.pageTotal }页,${ requestScope.page.pageTotalCount }条记录
            到第<input value="${param.pageNo}"  name="pn" id="pn_input"/><input id="searchPageBtn" type="button" value="确定">
            <script type="text/javascript">
             $(function () {
                 // 跳到指定的页码
                 $("#searchPageBtn").click(function () {
                     alert($("#pn_input").val());
                     var pageNo = $("#pn_input").val();
                     location.href = "BookServlet?op=getAllBookByPage&pageNo=" + pageNo;
                 });
             });
            </script>
    </div>

page对象的修改

public void setPageNo(Integer pageNo) {

    //数据边界的有效校验
    if(pageNo<1){
        pageNo=1;
   }
   if(pageNo>pageTotal){
        pageNo=pageTotal;
    }
    this.pageNo = pageNo;
}

service层方法的修改

 @Override
    public Page<Book> page(int pageNo, int pageSize) {
        Page <Book> page = new Page2<Book>();
//        //设置当前页码 必须放在下面
//       page.setPageNo(pageNo);
//        //设置每页显示的数量
        page.setPageSize(pageSize);

        //求总记录数
        Integer totalCount = (int)iBookDao.getCount();
        //设置总记录数
        page.setPageTotalCount(totalCount);

        //求总页码
        Integer totalPage = totalCount%pageSize == 0 ?totalCount/pageSize:totalCount/pageSize+1;
        //设置总页码
        page.setPageTotal(totalPage);

        //设置当前页码
        page.setPageNo(pageNo);

        //求当前页开始索引
        int begin = (pageNo - 1) * pageSize;
        //求当前页数据
        List<Book> items = iBookDao.getByPage(begin,pageSize);
        //设置当前页数据
        page.setItems(items);

        return page;
    }

分页条的抽取

在page对象中添加URL属性

public class Page<T> {
    public static final Integer PAGE_SIZE=4;
    //当前页码数
    private Integer pageNo;
    //总页码数
    private Integer pageTotal;
    //总记录数
    private Integer pageTotalCount;
    //当前页显示数量
    private Integer pageSize=PAGE_SIZE;
    //当前页显示数据
    private List<T> items;

    //分页条的请求地址
    private  String url;

在servlet程序的page分页方法中设置URL的分页请求地址

 protected void getAllBookByPage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1 获取请求的参数 pageNo 和 pageSize
        int pageNo = WebUtils.parseInt(request.getParameter("pageNo"), 1);
        int pageSize = WebUtils.parseInt(request.getParameter("pageSize"), Page2.PAGE_SIZE);

        //2 调用 BookService.page(pageNo,pageSize):Page 对象
        Page2<Book> page = iBookService.page(pageNo, pageSize);
        page.setUrl("BookServlet?op=getAllBookByPage");
        System.out.println(page.getItems());
        //3 保存 Page 对象到 Request 域中
        request.setAttribute("page",page);

        //4 请求转发到/pages/book/booksPage.jsp 页面
        request.getRequestDispatcher("/pages/book/booksByPage.jsp").forward(request,response);
    }

修改分页条中请求地址为URL变量输出,并抽取一个单独的jsp页面

page_nav.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--分页条的开始--%>
<div id="page_nav">
    <%--大于首页,才显示--%>
    <c:if test="${requestScope.page.pageNo > 1}">
        <a href="${ requestScope.page.url }&pageNo=1">首页</a>
        <a href="${ requestScope.page.url }&pageNo=${requestScope.page.pageNo-1}">上一页</a>
    </c:if>
    <%--页码输出的开始--%>
    <c:choose>
        <%--情况1:如果总页码小于等于5的情况,页码的范围是:1-总页码--%>
        <c:when test="${ requestScope.page.pageTotal <= 5 }">
            <c:set var="begin" value="1"/>
            <c:set var="end" value="${requestScope.page.pageTotal}"/>
        </c:when>
        <%--情况2:总页码大于5的情况--%>
        <c:when test="${requestScope.page.pageTotal > 5}">
            <c:choose>
                <%--小情况1:当前页码为前面3个:123的情况,页码范围是:1-5.--%>
                <c:when test="${requestScope.page.pageNo <= 3}">
                    <c:set var="begin" value="1"/>
                    <c:set var="end" value="5"/>
                </c:when>
                <%--小情况2:当前页码为最后3个,8910,页码范围是:总页码减4 - 总页码--%>
                <c:when test="${requestScope.page.pageNo > requestScope.page.pageTotal-3}">
                    <c:set var="begin" value="${requestScope.page.pageTotal-4}"/>
                    <c:set var="end" value="${requestScope.page.pageTotal}"/>
                </c:when>
                <%--小情况34567,页码范围是:当前页码减2 - 当前页码加2--%>
                <c:otherwise>
                    <c:set var="begin" value="${requestScope.page.pageNo-2}"/>
                    <c:set var="end" value="${requestScope.page.pageNo+2}"/>
                </c:otherwise>
            </c:choose>
        </c:when>
    </c:choose>

    <c:forEach begin="${begin}" end="${end}" var="i">
        <c:if test="${i == requestScope.page.pageNo}">
            【${i}</c:if>
        <c:if test="${i != requestScope.page.pageNo}">
            <a href="${ requestScope.page.url }&pageNo=${i}">${i}</a>
        </c:if>
    </c:forEach>
    <%--页码输出的结束--%>


    <%-- 如果已经 是最后一页,则不显示下一页,末页 --%>
    <c:if test="${requestScope.page.pageNo < requestScope.page.pageTotal}">
        <a href="${ requestScope.page.url }&pageNo=${requestScope.page.pageNo+1}">下一页</a>
        <a href="${ requestScope.page.url }&pageNo=${requestScope.page.pageTotal}">末页</a>
    </c:if>

    共${ requestScope.page.pageTotal }页,${ requestScope.page.pageTotalCount }条记录
    到第<input value="${param.pageNo}" name="pn" id="pn_input"/><input id="searchPageBtn" type="button" value="确定">

    <script type="text/javascript">

        $(function () {
            // 跳到指定的页码
            $("#searchPageBtn").click(function () {

                var pageNo = $("#pn_input").val();

                <%--var pageTotal = ${requestScope.page.pageTotal};--%>
                <%--alert(pageTotal);--%>

                // javaScript语言中提供了一个location地址栏对象
                // 它有一个属性叫href.它可以获取浏览器地址栏中的地址
                // href属性可读,可写
                location.href = "${pageScope.basePath}${ requestScope.page.url }&pageNo=" + pageNo;

            });
        });


    </script>

</div>
<%--分页条的结束--%>

分页实现二

在这里插入图片描述

page实体类

package entity;

public class Page {
    private Integer pageIndex;//当前页码

    private Integer pageSize;//页大小 显示有多少数据

    private Integer totalCounts;//数据的总行数

    private Integer totalPages;//总页数

    private Integer startRows;//起始行

    /**含有当前页码的构造器
     */
    public Page(Integer pageIndex) {
        this(pageIndex,4);
    }

    public Page(Integer pageIndex, Integer pageSize) {
        this.pageIndex = pageIndex;
        this.pageSize = pageSize;
        /**在构造器中设置起始行  (当前页码数-1)* 页数据
         *
         */
        this.setStartRows((pageIndex - 1) * pageSize);
    }

    public Integer getPageIndex() {
        return pageIndex;
    }

    public void setPageIndex(Integer pageIndex) {
        this.pageIndex = pageIndex;
    }

    public Integer getPageSize() {
        return pageSize;
    }

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

    public Integer getTotalCounts() {
        return totalCounts;
    }

    /**
     * 通过总条目数设置总页数
     * 总条目数对页大小模运算
     * @param totalCounts
     */
    public void setTotalCounts(Integer totalCounts) {
        this.totalCounts=totalCounts;
        this.setTotalPages(totalCounts%pageSize == 0 ?totalCounts/pageSize:totalCounts/pageSize+1);
    }

    public Integer getTotalPages() {
        return totalPages;
    }

    public void setTotalPages(Integer totalPages) {
        this.totalPages = totalPages;
    }

    public Integer getStartRows() {
        return startRows;
    }

    public void setStartRows(Integer startRows) {
        this.startRows = startRows;
    }
}

Dao层

dao

//分页查询所有
List<User> selectAll(Page page);

daoImpl


  QueryRunner qr = new QueryRunner(DBPoolUtil.getDataSource());
@Override
public List<User> selectAll(Page page) {
    try {
        return qr.query("select * from t_user limit ?,?",new BeanListHandler<User>(User.class),
                page.getStartRows(),page.getPageSize());
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }
    return null;
}

service层

service

//分页显示
List<User> showAll(Page page);

serviceImpl

//分页展示所有
@Override
public List<User> showAll(Page page) {
    List<User> users = null;

    //获取总行数
    long count = iUserDao.getCount();
    //将总行数传递给Page对象的构造器
    page.setTotalCounts((int) count);
    //根据controller传递的Page对象查询对应数据
    users = iUserDao.selectAll(page);
    return users;
}

controller层

//分页查找所有
protected void selectAllByPage(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   //获取当前页
    String pageIndex = req.getParameter("pageIndex");
    //如果是第一次访问
    if(pageIndex == null){
        pageIndex = "1";
    }

    Page page = new Page(Integer.valueOf(pageIndex));

    List<User> usersPage = iUserService.showAll(page);
    for (User user : usersPage) {
        System.out.println(user);
    }
    //将usersPage保存到域中
    req.setAttribute("userPage",usersPage);
    //将page页保存到域中
    req.setAttribute("page",page);
  System.out.println(page.getTotalPages());
    req.getRequestDispatcher("/pages/user/usersPage.jsp").forward(req,resp);
}

usersPage.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <title>users</title>
</head>
<body>
<c:if test="${userPage == null || userPage.size()==0}">
    no date
    ${userPage}
</c:if>
<c:if test="${userPage != null || userPage.size()!=0}">
    <table border="1" align="center" width="80%">
        <tr>
            <th>id</th>
            <th>name</th>
            <th>password</th>
            <th>email</th>
            <th>manger</th>
        </tr>
        <c:forEach items="${userPage}" var="p">
            <tr>
                <td>${p.id}</td>
                <td>${p.username}</td>
                <td>${p.password}</td>
                <td>${p.email}</td>
                <td><a href="UserServlet?op=getById&id=${p.id}">修改</a>
                    <a href="UserServlet?op=delete&id=${p.id}">删除</a>
                </td>
            </tr>
        </c:forEach>
        <tr>
            <td colspan="5">
                <a href="UserServlet?op=selectAllByPage&pageIndex=1">首页

                    <c:if test="${page.pageIndex>1}">
                        <a href="UserServlet?op=selectAllByPage&pageIndex=${page.pageIndex-1}">上一页</a>
                    </c:if>

                    <c:if test="${page.pageIndex==1}">
                        <a>上一页</a>
                    </c:if>

                    <c:if test="${page.pageIndex<page.totalPages}">
                        <a href="UserServlet?op=selectAllByPage&pageIndex=${page.pageIndex+1}">下一页</a>
                    </c:if>
                    <c:if test="${page.pageIndex==page.totalPages}">
                        <a>下一页</a>
                    </c:if>


                    <a href="UserServlet?op=selectAllByPage&pageIndex=${page.totalPages}">尾页</a>

                </a>
            </td>
        </tr>
    </table>
</c:if>

<h1><a href="/demo/pages/user/saveUser.jsp">添加</a></h1>
</body>
</html>
                <c:if test="${page.pageIndex==1}">
                        <a>上一页</a>
                    </c:if>

                    <c:if test="${page.pageIndex<page.totalPages}">
                        <a href="UserServlet?op=selectAllByPage&pageIndex=${page.pageIndex+1}">下一页</a>
                    </c:if>
                    <c:if test="${page.pageIndex==page.totalPages}">
                        <a>下一页</a>
                    </c:if>


                    <a href="UserServlet?op=selectAllByPage&pageIndex=${page.totalPages}">尾页</a>

                </a>
            </td>
        </tr>
    </table>
</c:if>

<h1><a href="/demo/pages/user/saveUser.jsp">添加</a></h1>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值