Servlet+JSP 实现分页查询的功能

创建一个存储分页信息的工具类

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>

最终展示效果

在这里插入图片描述

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值