现在我们的图书管理页面是将数据库中所有图书的信息都展示在了页面中,这是非常不合理。我们应该将图书信息进行分页展示。
分页展示的优点:
降低服务器的压力提高用户体验 1.实现分析
原来该页面只需要从Servlet侧获取到数据库中所有的图书列表,然后使用for循环将数据展示在页面即可。现在要实现分页,则需要展示更多信息了。如下:
要实现上面的功能,就需要从Servlet侧获取到:①当前页面图书信息的List;②当前页面数;③总页面数;④总记录数。一般我们有两种方式来实现:
(1)在该功能的Service代码中,处理相关数据,并通过Servlet传递到页面。这种方式比较简单,但是没有复用性,每一个类似功能,都需要代码进行处理。(2)创建一个PageBean(业务bean),在PageBean中封装相关数据。每次需要实现分页功能时,返回PageBean到页面即可。推荐这种方式 2.PageBean实现
其中:
List是根据当前页面,及每页需要展示的记录数,从数据库中读取的数据。SELECt id,title,author,price,sales,stock,img_path as imgPath FROM books LIMIT (当前页数-1)*每页显示记录数,每页显示记录数;PAGE_SIZE是每页需要显示的记录数。一般可以设置为静态常量pageNo:当前页。需要页面传递到后台totalPageNo:总页数。通过计算得出totalRecord:总记录数。通过数据库查询得出。SELECt COUNT(*) FROM books;
实现:在bean目录下创建Page类
package com.bookstore.bean; import java.util.List; public class Page3.Dao层实现{ private List list; public static final int PAGE_SIZE = 5; private int pageNo; private int totalPageNo; private int totalRecord; public Page(List list, int pageNo, int totalPageNo, int totalRecord) { this.list = list; this.pageNo = pageNo; this.totalPageNo = totalPageNo; this.totalRecord = totalRecord; } public Page() { } public List getList() { return list; } public void setList(List list) { this.list = list; } public int getPageNo() { return pageNo; } public void setPageNo(int pageNo) { this.pageNo = pageNo; } public int getTotalPageNo() { return totalPageNo; } public void setTotalPageNo(int totalPageNo) { this.totalPageNo = totalPageNo; } public int getTotalRecord() { return totalRecord; } public void setTotalRecord(int totalRecord) { this.totalRecord = totalRecord; } }
修改BookDao:添加一个分页的方法
Page getPageBook(Page page) → 分页查找图书的方法
该方法由BookService调用,传过来一个带有pageNo的Page 类型的page参数,通过该方法从数据库中先获取总的记录数,然后通过page的(pageNo-1)*PAGE_SIZE和PAGE_SIZE获取一个带分页的List集合。给page设置了总的记录数和List后再将page返回。
在BookDao接口中,新增方法public Page
public PagegetPageBook(Page page);
在BookDaoImpl实现类中,实现方法getPageBook
@Override public Page4.Service层实现getPageBook(Page page) { // 获取总的记录数 String sql1 = "SELECt COUNT(*) FROM books"; Object totalRecord = getSinglevalue(sql1); page.setTotalRecord(Integer.parseInt(String.valueOf(totalRecord))); // 获取当前页面需要展示的记录列表 int pageNo = page.getPageNo(); // 当前页数,该参数需要用户从页面传递过来 String sql2 = "SELECt id,title,author,price,sales,stock,img_path as imgPath FROM books LIMIT ?,?"; List beanList = getBeanList(Book.class, sql2, (pageNo - 1) * Page.PAGE_SIZE, Page.PAGE_SIZE); page.setList(beanList); // 获取总页数 int totalPageNo = (int) Math.ceil((double) page.getTotalPageNo() / Page.PAGE_SIZE); // 如果是小数需要向上取整 page.setTotalPageNo(totalPageNo); return page; }
修改BookService:同样添加一个分页的方法
Page getPageBookService(String pageNo) → 分页查找图书的方法
该方法由Servlet调用,接受的请求参数都是String类型的,所以传入的页码pageNo设置为了字符串类型。实现该方法是首先要创建一个Page对象,然后设置pageNo属性,不过这里需要将获取的字符串类型的pageNo转换为int类型。注意:有可能会出现转换异常(例如用户输入的是字符串abc)
在BookService接口中,新增方法Page
public PagegetPageBookService(String pageNo);
在BookServiceImpl实现类中,实现getPageBookService方法
@Override public Page5.Servlet层实现getPageBookService(String pageNo) { // 创建Page对象 Page page = new Page<>(); int resPageNo = Integer.parseInt(pageNo); page.setPageNo(resPageNo); // 调用BookDao中的方法 Page pageBook = getPageBook(page); return pageBook; }
在BookManagerServlet中添加getPageBook()方法,用于接收页面参数,并返回Page对象到页面中
protected void getPageBook(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.获取请求参数
String pageNo = request.getParameter("pageNo");
if (pageNo == null){
pageNo = "1"; // 如果未传入pageNo,则默认为第一页
}
// 2.调用service相应方法
Page pageBook = service.getPageBookService(pageNo);
// 3.将数据共享到域中
request.setAttribute("page",pageBook);
// 4.路径跳转
request.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(request,response);
}
6.JSP层实现
这时我们发现我们原来的bookList()已经没用了,需要讲jsp文件和Servlet中使用了bookList的地方替换为getPageBook,否则导致原来添加图书、修改图书、删除图书出现bug在book_manager.jsp页面中,根据Servlet侧返回的Page,来将数据展示中页面中。并
完成首页、尾页、上一页、下一页、跳转到xx页的功能



