一、你需要先创建一个bean对象(也就是page对象)
- 创建出你需要的属性比如在我的项目中我需要用到的:有当前的页码currentPage
- 当前的页显示的数量currentCount
- 你从数据库中查询得到的所有数据总和totalCount(这个你需要在dao层定义方法实现并把得到的数据返回给service层)
- 一共需要分多少页totalPage(这个需要你去计算通过查询所有的数据总和/currentCount,还用到了math.ceil()方法)
- 最后生成setter和getter方法
二、在servlet层去调用service层实现已经写好的方法
public void getCategoryList(HttpServletRequest request, HttpServletResponse response) throws SQLException, ServletException, IOException {
int currentPage = Integer.parseInt(request.getParameter("currentPage"));
int currentCount = Integer.parseInt(request.getParameter("currentCount"));
if (currentPage==0){
currentPage=1;
}
if (currentCount==0){
currentCount=10;
}
CategoryService service = new CategoryService();
Page page= service.findPageCategory(currentPage,currentCount);
if (page!=null) {
request.setAttribute("page",page);
request.getRequestDispatcher("/category-list.jsp").forward(request,response);
}else {
request.getRequestDispatcher("/category-list.jsp").forward(request,response);
}
}
- 先创建一个service层的对象
- 然后在service层去创建一个方法 findPageCategory,这个方法就是为了获取到跟分页有关的所有的属性(也就是totalPage,totalCount)
(1)如何得到totalPage,totalCount这两个参数呢?(service层)
- 需要先创建一个dao层的categoryDao对象来从数据库中取出数据
- totalCount可以直接得到结果,而totalPage需要计算(用totalCount/currentCount)
- 把所得到的四个page属性都设置给page实体类(用setAttribute方法)
- 到这还需要重新定义一个startPosition(也就是在后面用SQL语句的limit中需要用到的那个参数,每次查询的起始位置)
- 规律就是规律就是:每次查询的起始位置=(当前的的页面-1)*每页固定显示的数据
public Page findPageCategory(int currentPage,int currentCount ) throws SQLException {
Page page = new Page();
CategoryDao dao = new CategoryDao();
int totalCount = dao.queryCount();
int totalPage = (int) Math.ceil(1.0*totalCount / currentCount);
page.setCurrentCount(currentCount);
page.setCurrentPage(currentPage);
page.setTotalCount(totalCount);
page.setTotalPage(totalPage);
int startPosition = (currentPage-1)*currentCount;
List<Category> categories = dao.queryPageCategoryList(startPosition, currentCount);
page.setList(categories);
return page;
}
三、在Dao层去实现两个方法
- 是查询数据库中的所有数据总和
public int queryCount() throws SQLException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
QueryRunner queryRunner=new QueryRunner(dataSource);
String sql = "select count(*) category ";
Long query = queryRunner.query(sql, new ScalarHandler<>());
return query.intValue();
}
- 分页查询数据(也就是使用SQL中聚合语句limit去查询数据limit数据后面的第一个数据是查询的起始位置,第二个参数表示每个分页查询多少条数据)
public List<Category> queryPageCategoryList(int startPosion, int currentCount) throws SQLException {
ComboPooledDataSource dataSource= new ComboPooledDataSource();
QueryRunner queryRunner= new QueryRunner(dataSource);
String sql = "select * from category limit ?,?";
List<Category> categoryList = queryRunner.query(sql, new BeanListHandler<Category>(Category.class),startPosion,currentCount);
return categoryList;
}