5.1 分页模块的分析
5.2 分页模型Page的抽取
抽取五个分页模型的基本元素:
当前页数、总页数、总记录数、当前页数据、每页记录数。
5.3编写PageDao类并进行测试
1.接口
public interface PageDao<T> {
//求总记录数
Integer queryForPageTotalCount();
//求当前页数据
//begin表示当前页数据的开始索引
//pageSize表示当前需要显示的记录条数
List<T> queryForItems(int begin,int pageSize);
}
2.实现类
public class PageDaoImpl extends BaseDao implements PageDao<Book> {
@Override
public Integer queryForPageTotalCount() {
String sql = "select count(*) from t_book";
Number number =(Number) queryForValue(sql);
return number.intValue();
}
@Override
public List<Book> queryForItems(int begin, int pageSize) {
//注意:这个limit字句的后面一定是有空格的!为了防止出错,可以将该语句放入mysql中尝试查询。
String sql = "select `id`,`name`,`author`,`price`,`sales`,`stock`,`img_path` from t_book limit ?,? ";
return queryforList(sql,Book.class,begin,pageSize);
}
}
3.测试:
public class PageDaoTest {
PageDao pageDao = new PageDaoImpl();
@Test
public void queryForPageTotalCount() {
System.out.println(pageDao.queryForPageTotalCount());
}
@Test
public void queryForItems() {
System.out.println(pageDao.queryForItems(1,Page.PAGE_SIZE));
}
}
5.4编写bookservice类的page方法并进行测试
1.编写方法
public Page<Book> page(int pageNo, int pageSize) {
Page<Book> page = new Page<>();
//首先设置当前页码
page.setPageNo(pageNo);
//设置当前页的总记录数
page.setPageTotalCount(pageDao.queryForPageTotalCount());
//设置当前页的显示数量
page.setPageSize(pageSize);
//设置当前页数据
//设置当前页数据时,先求begin(当前页索引)和pageSize.
//当前页数据的索引按如下公式来求
int begin = (page.getPageNo()-1)*pageSize;
//将begin形参传入函数中
List<Book> books = pageDao.queryForItems(begin, pageSize);
//设置当前页数据
page.setItems(books);
//设置总页码
Integer num = page.getPageTotalCount()%page.getPageSize();
if(num==0){
page.setPageTotal(page.getPageTotalCount()/page.getPageSize());
}else{
page.setPageTotal(page.getPageTotalCount()/page.getPageSize()+1);
}
return page;
}
2.进行测试
public void page() {
System.out.println(bookService.page(1, Page.PAGE_SIZE));
}
5.5编写bookservlet程序
1.先修改地址:
<a href="manager/bookServlet?action=page">图书管理</a>
2.然后编写servlet程序
protected void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//分析:在进行分页之前,需要提供两个参数:
// pageNo:当前页码
//pageSize:每页显示数量
//根据传入的参数确定当前页码,如果当前没有传入参数,则表示首页。
int pageNo = WebUtils.parseInt(req.getParameter("pageNo"), 1);
int pageSize = WebUtils.parseInt(req.getParameter("pageSize"), Page.PAGE_SIZE);
//进行分页
Page<Book> page = bookService.page(pageNo, pageSize);
//注意:在分页的时候,jsp还需要page数据!所以要将page中的数据存档到request域中
req.setAttribute("page",page);
//分页中提取出数据
List<Book> items = page.getItems();
//将这个list<Book>集合中的数据保存到request域中即可
req.setAttribute("books",items);
//分页完成之后,请求转发到book_manager.jsp页面
req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
}
3.写分页条
<div id="page_nav">
<a href="#">首页</a>
<a href="#">上一页</a>
<a href