「书城第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=当前页面。

被折叠的 条评论
为什么被折叠?



