Page分页

图书分页

分页模块的分析

在这里插入图片描述

分页模型Page 的抽取(当前页数,总页数,总记录数,当前页数据,每页记录数)

/**
* Page 是分页的模型对象
* @param <T> 是具体的模块的javaBean 类
*/
public class Page<T> {
public static final Integer PAGE_SIZE = 4;
// 当前页码
private Integer pageNo;
// 总页码
private Integer pageTotal;
// 当前页显示数量
private Integer pageSize = PAGE_SIZE;
// 总记录数
private Integer pageTotalCount;
// 当前页数据
private List<T> items;

分页的实现

BookDao 代码:

@Override
public Integer queryForPageTotalCount() {
    String sql = "select count(*) from t_book";
    Number count = (Number) queryForSingleValue(sql);
    return count.intValue();
}

@Override
public List<Book> queryForPageItems(int begin, int pageSize) {
    String sql = "select `id` , `name` , `author` , `price` , `sales` , `stock` , `img_path` imgPath from t_book limit ?,?";
    return querryForList(Book.class,sql,begin,pageSize);
}

BookService 代码:

@Override
public Page<Book> page(int pageNo, int pageSize) {
  Page<Book> page = new Page<Book>();
  page.setPageSize(pageSize);
  //总记录数
  Integer pageTotalCount = bookDao.queryForPageTotalCount();
  page.setPageTotalCount(pageTotalCount);

   //求总页码
  Integer pageToal = pageTotalCount/pageSize;
  if (pageTotalCount % pageSize>0){
       pageToal+=1;
  }
  page.setPageTotal(pageToal);
  page.setPageNo(pageNo);
  int begin = (page.getPageNo()-1)*pageSize;
  List<Book> items = bookDao.queryForPageItems(begin,pageSize);
  page.setItems(items);
  return page;

}

BookServlet 程序的代码:

    /**
     * 处理分页功能
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
protected  void page(HttpServletRequest req,HttpServletResponse resp) throws  ServletException,IOException{
    //获取pageNo 和 pageSize
    int pageNo = WebUtils.parseInt(req.getParameter("pageNo"),1);
    int pageSize = Page.PAGE_SIZE;
    if(req.getParameter("pageSize")!=null){
         pageSize = WebUtils.parseInt(req.getParameter("pageSize"), Page.PAGE_SIZE);

    }
    //查询获取新的page
    Page<Book> page = bookService.page(pageNo,pageSize);
    page.setUrl("manager/bookServlet?action=page");
//        req.setAttribute();
    req.setAttribute("page",page);

    req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
}

定义分类条JSP

<%--
  Created by IntelliJ IDEA.
  User: Mr_xiaobai
  Date: 2021/6/30
  Time: 9:40
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<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 }">
                <!--设置map,两个一个begin,一个end-->
                <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="${requestScope.page.pageNo}" name="pn" id="pn_input"/><input id="searchPageBtn" type="button" value="确定">
</div>
<script type="text/javascript">
    //给页面跳转添加监听事件
    $(function () {
         $("#searchPageBtn").click(function () {
             //跳转到指定页面
             var pageNo = $("#pn_input").val();
             location.href="${pageScope.basePath}${requestScope.page.url}&pageNo=" + pageNo;

         });
    })

</script>

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

版权声明:本文为Mr_tianyanxiaobai原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。