创建一个存储分页信息的工具类
package com.robot.utils;
import java.util.List;
/**
* 存储页面的相关信息。
*
* @author 张宝旭
*/
public class PageBean<T> {
/**
* 当前页面
*/
private int curPage;
/**
* 每页大小
*/
private int pageSize;
/**
* 总页数
*/
private int pageCount;
/**
* 总数据量
*/
private Long dataCount;
/**
* 每页的数据
*/
private List<T> data;
public PageBean() {
}
public PageBean(int curPage, int pageSize, Long dataCount, List<T> data) {
this.curPage = curPage;
this.pageSize = pageSize;
this.dataCount = dataCount;
this.data = data;
// 计算总页数
pageCount = (int) (dataCount % pageSize == 0 ? dataCount % pageSize : dataCount % pageSize + 1);
}
public int getCurPage() {
return curPage;
}
public void setCurPage(int curPage) {
this.curPage = curPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public Long getDataCount() {
return dataCount;
}
public void setDataCount(Long dataCount) {
this.dataCount = dataCount;
}
public List<T> getData() {
return data;
}
public void setData(List<T> data) {
this.data = data;
}
@Override
public String toString() {
return "PageBean{" +
"curPage=" + curPage +
", pageSize=" + pageSize +
", pageCount=" + pageCount +
", dataCount=" + dataCount +
", data=" + data +
'}';
}
}
在DAO层创建两个方法,一个用于查询分页查询所有数据,一个用于统计表中数据数量
List<Book> selectBookList(int curPage, int pageSiz);
Long countALlData();
实现类
// 创建执行对象
QueryRunner queryRunner = new QueryRunner(DbPoolUtils.getDataSource());
@Override
public List<Book> selectBookList(int curPage, int pageSize) {
String sql = "SELECT id, title, author, publicDate, publisher, isbn, price, picture, cid FROM book ORDER BY id LIMIT ?,?";
Object[] params = {(curPage - 1) * pageSize, pageSize};
try {
return queryRunner.query(sql, new BeanListHandler<>(Book.class), params);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("查询所有失败", e);
}
}
@Override
public Long countALlData() {
String sql = "SELECT COUNT(*) FROM book";
try {
return queryRunner.query(sql, new ScalarHandler<>());
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("查询总数量失败", e);
}
}
在Service层创建分页查询的方法,返回类型为PageBean< Book>
PageBean<Book> queryAllBook(int curPage, int pageSize);
实现类,将查询到的总数据量和数据都封装到PageBean中
// 创建Dao层对象
BookShopDao bookShopDao = new BookShopDaoImpl();
@Override
public PageBean<Book> queryAllBook(int curPage, int pageSize) {
Long dataCount = bookShopDao.countALlData();
List<Book> bookList = bookShopDao.selectBookList(curPage, pageSize);
PageBean<Book> pageBean = new PageBean<>(curPage, pageSize,dataCount, bookList);
return pageBean;
}
在Servlet类中进行处理,先获取页面信息,如果是第一次执行,则使用默认初始的当前页
然后执行,并将返回的PageBean存储到request中,转发到对应的jsp页面中
// 获取页信息
String curPage = request.getParameter("curPage");
int myCurPage = 1;
if (!StringUtils.isEmpty(curPage)) {
myCurPage = Integer.parseInt(curPage);
if (myCurPage <= 0) {
myCurPage = 1;
}
}
BookshopService bookshopService = new BookshopServiceImpl();
PageBean<Book> pageBean = bookshopService.queryAllBook(myCurPage, 5);
request.setAttribute("pageBean", pageBean);
request.getRequestDispatcher("/queryAllBook.jsp").forward(request, response);
在JSP页面中,使用forEach进行循环,使用的就是传过来的pageBean中的data属性了,因为data属性存储的就是查询结果,是List集合
<c:forEach items="${pageBean.data}" var="book">
最后可以在页面的最下面写一个简单的翻页功能
<div style="margin-left: 400px">
<a href="${pageContext.request.contextPath}/queryAllBook?curPage=1">首页</a>
<a href="${pageContext.request.contextPath}/queryAllBook?curPage=${pageBean.curPage-1}">上一页</a>
<c:if test="${pageBean.curPage>=pageBean.pageCount}">
<a href="${pageContext.request.contextPath}/queryAllBook?curPage=${pageBean.pageCount}">下一页</a>
</c:if>
<c:if test="${pageBean.curPage<pageBean.pageCount}">
<a href="${pageContext.request.contextPath}/queryAllBook?curPage=${pageBean.curPage+1}">下一页</a>
</c:if>
<a href="${pageContext.request.contextPath}/queryAllBook?curPage=${pageBean.pageCount}">尾页</a>
</div>
最终展示效果