【JavaWeb】实现分页操作的底层实现

Dao层代码:

/**
     * 根据当前页码数和每页信息数来返回一个Book集合
     *
     * @param currentPage   当前页码
     * @param pageSize      每页记录数
     * @return
     */
    public List<Book> findByPage(Integer currentPage,Integer pageSize){
        List<Book> books = new ArrayList<Book>();

        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            //获取资源链接对象
            conn = getConnection();
            //定义sql
            String sql = "select * from book limit ? , ?";
            //创建sql执行对象
            pstmt = conn.prepareStatement(sql);
            //给?,?进行赋值,第一个是当前开始索引的记录位置,第二个是索引的条数
            //第一个参数是(当前页数-1)*每一页记录数,代表开始索引的位置
            //第二个参数是每一页的记录数
            pstmt.setInt(1,(currentPage - 1)*pageSize);
            pstmt.setInt(2,pageSize);
            //执行sql
            rs = pstmt.executeQuery();
            while (rs.next()){

                Book book = new Book();

                book.setId(rs.getInt("id"));
                book.setName(rs.getString("name"));
                book.setPrice(rs.getDouble("price"));
                book.setCategory(rs.getString("category"));
                book.setPnum(rs.getInt("pnum"));
                book.setImgurl(rs.getString("imgurl"));
                book.setDescription(rs.getString("description"));
                book.setAuthor(rs.getString("author"));
                book.setSales(rs.getInt("sales"));

                books.add(book);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close(rs,pstmt,conn);
        }
        //返回一个带有数据的集合
        return books;
    }

    public Integer countBook(){

        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        Integer num = 0;

        try {
            conn = getConnection();
            String sql = "select count(*) from book";
            pstmt = conn.prepareStatement(sql);
            rs = pstmt.executeQuery();
            while (rs.next()){

                //获取第一行第一列的数字给num
                num = rs.getInt(1);

            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close(rs,pstmt,conn);
        }
        return num;
    }

PageBean实体类:

package com.ysw.web.entity;

import java.util.List;

public class PageBean {

    private Integer currentPage;        //当前页码数
    private Integer pageSize;           //每页记录数
    private Integer count;              //总记录数
    private Integer totalPage;          //总页数
    private List<Book> books;           //当前页的数据集合

    public Integer getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(Integer currentPage) {
        this.currentPage = currentPage;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getCount() {
        return count;
    }

    public void setCount(Integer count) {
        this.count = count;
    }

    public Integer getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(Integer totalPage) {
        this.totalPage = totalPage;
    }

    public List<Book> getBooks() {
        return books;
    }

    public void setBooks(List<Book> books) {
        this.books = books;
    }
}

 Servlet层代码:

package com.ysw.web.servlet;

import com.ysw.web.entity.PageBean;
import com.ysw.web.service.BookService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/pageServlet")
public class PageServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String currentPage = request.getParameter("currentPage");
        int pageNo = 1;     //默认一开始的pageNo = 1

        //当我们前端传入一个currentPage过来时,currentPage不为空
        if (currentPage != null) {
            //给我们的pageNo进行赋值,赋值为我们当前的页码数
            pageNo = Integer.parseInt(currentPage);
        }

        //我们自行定义每一页显示的记录条数为3
        int pageSize = 3;

        BookService bookService = new BookService();
        //调用我们的service层,因为pageBean对象里面包含了所有的分页信息了
        PageBean pageBean = bookService.findByPage(pageNo,pageSize);

        //共享数据出去
        request.setAttribute("pageBean",pageBean);
        request.getRequestDispatcher("showAllBook.jsp").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

 Jsp页面代码:

<%--
  Created by IntelliJ IDEA.
  User: Simon
  Date: 2020/2/1
  Time: 23:11
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>国际图书商城</title>

    <link rel="stylesheet" href="static/bootstrap/css/bootstrap.min.css"/>
    <script src="static/bootstrap/js/jquery-3.1.0.min.js"></script>
    <script src="static/bootstrap/js/bootstrap.min.js"></script>

    <style>
        table {
            border: 3px solid;
            margin: auto;
            width: 900px;
            text-align: center;
        }

        h3 {
            text-align: center;
        }
    </style>

</head>
<body>
    <h3>国际图书商城</h3>

    <h3>多条件动态查询</h3>
    <form action="searchServlet" method="post">
        <table>
            <tr>
                <td>
                    编号:
                </td>

                <td>
                    <input type="text" name="id">
                </td>
            </tr>

            <tr>
                <td>
                    书名:
                </td>

                <td>
                    <input type="text" name="name">
                </td>
            </tr>

            <tr>
                <td>
                    最高价格:
                </td>

                <td>
                    <input type="text" name="maxPrice">
                </td>
            </tr>

            <tr>
                <td>
                    最低价格:
                </td>

                <td>
                    <input type="text" name="minPrice">
                </td>
            </tr>

            <tr>
                <td>
                    类别:
                </td>

                <td>
                    <input type="text" name="category">
                </td>
            </tr>

            <tr>
                <td>
                    最大库存:
                </td>

                <td>
                    <input type="text" name="maxPnum">
                </td>
            </tr>

            <tr>
                <td>
                    最小库存:
                </td>

                <td>
                    <input type="text" name="minPnum">
                </td>
            </tr>

            <tr>
                <td>
                    封面:
                </td>

                <td>
                    <input type="text" name="imgurl">
                </td>
            </tr>

            <tr>
                <td>
                    描述:
                </td>

                <td>
                    <input type="text" name="description">
                </td>
            </tr>

            <tr>
                <td>
                    作者:
                </td>

                <td>
                    <input type="text" name="author">
                </td>
            </tr>

            <tr>
                <td>
                    最高售量:
                </td>

                <td>
                    <input type="text" name="maxSales">
                </td>
            </tr>

            <tr>
                <td>
                    最低售量:
                </td>

                <td>
                    <input type="text" name="minSales">
                </td>
            </tr>

        </table>

        <center><input type="submit" value="查询"></center>
    </form>

<table border="1" cellspacing="0">
    <tr>
        <th>编号</th>
        <th>书名</th>
        <th>价格</th>
        <th>类别</th>
        <th>库存</th>
        <th>封面</th>
        <th>描述</th>
        <th>作者</th>
        <th>售量</th>
        <th></th>
        <th></th>
        <th></th>
        <th></th>

    </tr>

    <%--
        使用foreach循环进行遍历输出
        我们重新来理解一下foreach:
            当我们在requestScope中传入一个books集合的时候,
            我们的foreach容器就多了一个books集合,对其进行遍历也就是遍历books容器里面的每一个book对象
            这样的话我们每一个book对象就可以通过"."的方式,把具体的属性值取出来,这里类似于mybatis
    --%>
    <%--
        用于分页的:
        <c:forEach items="${pageBean.books}" var="book" varStatus="vs">
    --%>

    <%--正常使用的/复杂查询使用的--%>
    <c:forEach items="${books}" var="book" varStatus="vs">
        <tr>
            <td>${vs.count}</td>
            <td>${book.name}</td>
            <td>${book.price}</td>
            <td>${book.category}</td>
            <td>${book.pnum}</td>
            <td>${book.imgurl}</td>
            <td>${book.description}</td>
            <td>${book.author}</td>
            <td>${book.sales}</td>
            <td>
                    <%--这里在路径上传了一个book的id=book.id过去给后台--%>
                <a href="deleteBooksServlet?id=${book.id}">删除</a>
            </td>

            <td>
                <a href="selectByIdServlet?id=${book.id}">更新</a>
            </td>

            <td>
                <a href="addCartServlet?id=${book.id}">添加到购物车</a>
            </td>

            <td>
                <a href="addDataServlet?id=${book.id}">查看详情</a>
            </td>
        </tr>
    </c:forEach>

</table>

<br>
<br>
<br>
<center><b>请选择操作:</b></center>
<br>
<table>
    <tr>
        <td>
            <a href="addBook.jsp">新增图书</a>
        </td>
    </tr>

    <tr>
        <td>
            <a href="index.jsp">返回首页</a>
        </td>
    </tr>

    <tr>
        <td>
            <a href="showCartServlet">查看购物车</a>
        </td>
    </tr>

    <tr>
        <td>
            <a href="showDataServlet">查看浏览记录</a>
        </td>
    </tr>
</table>

<nav aria-label="Page navigation">
    <ul class="pagination">
        <c:if test="${pageBean.currentPage==1}">
            <li class="disabled">
        </c:if>

        <c:if test="${pageBean.currentPage!=1}">
            <li>
        </c:if>

            <a href="pageServlet?currentPage=${pageBean.currentPage==1?1:pageBean.currentPage-1}" >
                <span aria-hidden="true">
                    &laquo;
                </span>
            </a>
        </li>

        <c:forEach begin="1" end="${pageBean.totalPage}" var="i">
            <c:if test="${pageBean.currentPage == i}">
                <li class="active"><a href="pageServlet?currentPage=${i}">${i}</a></li>
            </c:if>

            <c:if test="${pageBean.currentPage!=i }">
                <li><a href="pageServlet?currentPage=${i}">${i}</a></li>
            </c:if>
        </c:forEach>

        <c:if test="${pageBean.currentPage==pageBean.totalPage}">
            <li class="disabled">
        </c:if>

        <c:if test="${pageBean.currentPage!=pageBean.totalPage}">
            <li>
        </c:if>

            <a href="pageServlet?currentPage=${pageBean.currentPage == pageBean.totalPage?pageBean.totalPage:pageBean.currentPage+1}">
                <span aria-hidden="true">
                    &raquo;
                </span>
            </a>
        </li>
    </ul>
</nav>
    <span style="font-size:15px;margin-left:5px;">
        共${pageBean.count}条记录,共${pageBean.totalPage}页
    </span>
</div>

<%--<div class="page">--%>

<%--<a href="pageServlet?currentPage=${pageBean.currentPage==1?1:pageBean.currentPage-1}">--%>
<%--&it;&it;上一页--%>
<%--</a>&nbsp;&nbsp;--%>

<%--第${pageBean.currentPage}页/共${pageBean.totalPage}页&nbsp;&nbsp;--%>

<%--<a href="pageServlet?currentPage=${pageBean.currentPage == pageBean.totalPage?pageBean.totalPage:pageBean.currentPage+1}">--%>
<%--下一页&gt;&gt;--%>
<%--</a>--%>

<%--</div>--%>

</body>
</html>

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值