「书城第5阶段」查询分页

「书城第5阶段」查询分页

因为目前的查询方法会一口气显示出来数据库的所有结果,但是有的时候并不需要这样,为了减少用户看不到的无效数据,这一章来从0开始设计分页。

需要处理的有:

(1)查询特定的数据

需要指定区间的两个数据

  • pageNo
  • pageSize
  • 创建一个page类,封装必要信息

(2)回传页面显示

(3)显示页码

  • 查询总共多少条记录

  • 求页码

  • 把显示页码变成可以点击的

    开始创建分页

    (1)编写BookDaoImpl中的必要查询

    • 查询总数
    • 查询指定的记录
    // 查询总数
    public Integer queryForPageTotalCount() {
        String sql = "select count(*) from t_book";
        Number count = (Number) queryForSingleValue(sql);
        return count.intValue();
    
    }
    // 查询指定的记录
    public List<Book> queryForPageItems(int begin, int pageSize) {
            String sql = "select `id`,`name`,`author`,`price`,`sales`,`stock`,`img_path` imgPath from t_book limit ?,?";
            List<Book> itemList = queryForList(Book.class, sql, begin, pageSize);
            return itemList;
    }
    

    (2)创建page类

    package wzy.pojo;
    
    import java.util.List;
    
    /**
     * page是分页模型的对象
     * @param <T> 表示它可以对一个具体的JavaBean类进行分类
     */
    public class Page<T> {
        public static final Integer PAGE_SIZE = 2;
        // 当前页码
        private Integer pageNo;
        // 当前显示数
        private Integer pageSize = PAGE_SIZE;
        // 当前页数据
        private List<T> items;
        // 总页码
        private Integer pageTotal;
        // 总记录数
        private Integer pageTotalCount;
    
    
        public Integer getPageNo() {
            return pageNo;
        }
    
        public void setPageNo(Integer pageNo) {
            if (pageNo < 1){
                pageNo =1;
            }
    
            if (pageNo > pageTotal){
                pageNo = pageTotal;
            }
    
            this.pageNo = pageNo;
        }
    
    
        public List<T> getItems() {
            return items;
        }
    
        public void setItems(List<T> items) {
            this.items = items;
        }
    
        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 Integer getPageSize() {
            return pageSize;
        }
    
        public void setPageSize(Integer pageSize) {
            this.pageSize = pageSize;
        }
    
        @Override
        public String toString() {
            return "Page{" +
                    "pageNo=" + pageNo +
                    ", pageSize=" + pageSize +
                    ", items=" + items +
                    ", pageTotal=" + pageTotal +
                    ", pageTotalCount=" + pageTotalCount +
                    '}';
        }
    }
    

    page对象中包含了查询需要的必要信息:

    • pageNo表示当前页码

    • pageTotal表示页码总数

    • pageSize表示页面展示数据的大小

    • pageTotalCount表示总的记录数

    • Items表示page元素中包含的查询对象

    (3)在BookServiceImpl中生成page对象列表

    public Page<Book> page(int pageNo, int pageSize) {
        // 创建page对象
        Page<Book> page = new Page<>();
        // 设置page属性pageSize
        page.setPageSize(pageSize);
        // 求总记录数字
        Integer pageTotalCount = bookDao.queryForPageTotalCount();
        // 设置总记录数
        page.setPageTotalCount(pageTotalCount);
        // 求总页码
        Integer pageTotal = pageTotalCount / pageSize;
        if (pageTotalCount % pageSize > 0){
            pageTotal += 1;
        }
        page.setPageTotal(pageTotal);
        // 设置当前页码
        page.setPageNo(pageNo); // 在这里进行页码校验
        // 求当前页面数据的开始索引
        int begin = (page.getPageNo() - 1) * pageSize;
        // 查询当前页面的数据
        List<Book> items =  bookDao.queryForPageItems(begin,pageSize);
        page.setItems(items);
    
        return page;
    }
    

    (3)在pageServlet中生成page对象,将数据进行转发至book_manager.jsp

    protected void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1 获取请求的参数 pageNo 和 pageSize
        int pageNo = WebUtils.parseInt(req.getParameter("pageNo"), 1);
        int pageSize = WebUtils.parseInt(req.getParameter("pageSize"), Page.PAGE_SIZE);
        //2 调用BookService.page(pageNo,pageSize):Page对象
        Page<Book> page = bookService.page(pageNo, pageSize);
        //3 保存Page对象到Request域中
        req.setAttribute("page", page);
        //4 请求转发到pages/manager/book_manager.jsp页面
        req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req, resp);
    }
    

    (4)book_manager.jsp页面使用request域中存储的数据进行图书遍历

    <c:forEach items="${requestScope.page.items}" var="book">
        <tr>
            <td>${book.name}</td>
            <td>${book.price}</td>
            <td>${book.author}</td>
            <td>${book.sales}</td>
            <td>${book.stock}</td>
        </tr>
    </c:forEach>
    

页码显示,规定页码只显示5个数字

  • 情况1:总页码小于5的情况
  • 情况2:总页码大于5
    • 大于5同时在前3个,显示前5个
    • 大于5同时在后3个,显示后5个
    • 大于5同时在中间情况,显示这个数字前2个与后两个
<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="manager/bookServlet?action=page&pageNo=${i}">${i}</a>
    </c:if>
</c:forEach>

(5)将数字绑定跳转页面,将首页、末页、下一页、上一页绑定Servlet请求

<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="manager/bookServlet?action=page&pageNo=${i}">${i}</a>
    </c:if>
</c:forEach>

<c:if test="${ requestScope.page.pageNo < requestScope.page.pageTotal }">
    <a href="manager/bookServlet?action=page&pageNo=${requestScope.page.pageNo + 1}">下一页</a>
    <a href="manager/bookServlet?action=page&pageNo=${requestScope.page.pageTotal}">末页</a>
</c:if>

每一个执行请求都包含了action=page和pageNo属性,都会执行Servlet程序,在请求中附带请求的页码,Servlet程序将信息封装为一个对象传回request域中

(6)分页对添加、删除、修改的影响

以前的Servlet添加操作跳转action=list

以前的Servlet删除操作跳转action=list

以前的Servlet修改操作跳转action=list

因为分页的影响,如果需要在添加、删除、修改后仍保留在原始页面,则需要修改action=page,回传pageNo=当前页面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值