分页的实现

步骤1:创建分页工具类(PageVo)

分页工具类是实现分页功能的核心,用于封装分页相关的属性和逻辑。

创建文件:src/cn/wolfcode/PageVo.java

package cn.wolfcode;

import lombok.Data;
import java.util.ArrayList;
import java.util.List;

@Data
public class PageVo<E> {
    private int curPage = 1;  // 当前页码,默认值为1
    private int pageSize = 5;  // 每页显示的记录数,默认值为5
    private int totalRows;     // 总记录数
    private int totalPage;     // 总页数
    private List<E> data;      // 存储分页数据的集合

    // 设置数据并触发分页逻辑
    public void setData(List<E> data) {
        this.totalRows = data.size();  // 计算总记录数
        this.totalPage = (totalRows + pageSize - 1) / pageSize;  // 计算总页数
        
        // 确保当前页码在有效范围内
        if (curPage < 1) {
            curPage = 1;
        }
        if (curPage > totalPage) {
            curPage = totalPage;
        }
        
        // 截取当前页的数据
        List<E> smallList = new ArrayList<>();
        for (int i = (curPage - 1) * pageSize; i < curPage * pageSize && i < totalRows; i++) {
            smallList.add(data.get(i));
        }
        this.data = smallList;
    }
}

步骤2:服务层封装分页数据

服务层负责调用数据访问层获取数据,并封装到分页对象中。

创建/修改文件:src/cn/wolfcode/service/impl/BookServiceImpl.java

@Override
public PageVo<Book> selectAllBypage(int curPage) {
    // 1. 查询所有图书数据
    List<Book> bookList = bookMapper.selectAll();
    
    // 2. 封装到PageVo对象
    PageVo<Book> bookPageVo = new PageVo<>();
    bookPageVo.setCurPage(curPage);  // 设置当前页码
    bookPageVo.setData(bookList);    // 触发分页逻辑
    
    return bookPageVo;  // 返回分页对象
}

步骤3:控制器层处理分页请求

控制器层接收用户请求中的分页参数,调用服务层获取分页数据,并转发到视图。

创建/修改文件:src/cn/wolfcode/servlet/BookServlet.java

@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    // 转换为HttpServletRequest和HttpServletResponse
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    
    // 设置字符编码
    request.setCharacterEncoding("utf-8");
    response.setCharacterEncoding("utf-8");
    
    // 1. 获取当前页码参数
    String curPageStr = request.getParameter("curPage");
    int curPage = 1;  // 默认值为1
    if (curPageStr != null && !""
    .equals(curPageStr.trim())) {
        curPage = Integer.valueOf(curPageStr);
    }
    
    // 2. 调用服务层方法获取分页数据
    PageVo<Book> books = bookService.selectAllBypage(curPage);
    
    // 3. 将分页数据设置到请求属性中
    request.setAttribute("books", books);
    
    // 4. 转发到JSP视图
    request.getRequestDispatcher("/WEB-INF/jsp/book/bookList.jsp").forward(request, response);
}

步骤4:创建/修改JSP视图

JSP视图负责展示分页数据和分页导航链接。

创建/修改文件:web/WEB-INF/jsp/book/bookList.jsp

<%@ page import="java.util.List" %>
<%@ page import="cn.wolfcode.domain.Book" %>
<%@ page import="cn.wolfcode.PageVo" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>图书列表</title>
    <script type="text/javascript">
        // 首页
        function first() {
            document.getElementById("curPage").value = 1;
            document.getElementById("f1").submit();
        }
        
        // 上一页
        function pre() {
            var curPage = parseInt(document.getElementById("curPage").value);
            if (curPage > 1) {
                document.getElementById("curPage").value = curPage - 1;
                document.getElementById("f1").submit();
            }
        }
        
        // 下一页
        function next() {
            var curPage = parseInt(document.getElementById("curPage").value);
            var totalPage = parseInt(document.getElementById("totalPage").value);
            if (curPage < totalPage) {
                document.getElementById("curPage").value = curPage + 1;
                document.getElementById("f1").submit();
            }
        }
        
        // 尾页
        function last() {
            var totalPage = parseInt(document.getElementById("totalPage").value);
            document.getElementById("curPage").value = totalPage;
            document.getElementById("f1").submit();
        }
    </script>
</head>
<body>
<form action="/books" method="post" id="f1">
    <table align="center" width="80%">
        <tr align="center">
            <th>编号</th>
            <th>书名</th>
            <th>作者</th>
            <th>售价</th>
            <th>进价</th>
            <th>分类</th>
        </tr>
        
        <%-- 显示图书列表 --%>
        <% 
            PageVo<Book> books = (PageVo<Book>) request.getAttribute("books");
            for (Book book : books.getData()) {
        %>
        <tr align="center">
            <td><%= book.getId() %></td>
            <td><%= book.getBname() %></td>
            <td><%= book.getAuthor() %></td>
            <td><%= book.getSalePrice() %></td>
            <td><%= book.getCostPrice() %></td>
            <td><%= book.getClassify() == 1 ? "国外文学" : "国内文学" %></td>
        </tr>
        <% 
            }
        %>
        
        <%-- 分页导航 --%>
        <tr align="center">
            <td colspan="6">
                <a href="#" onclick="first()">首页</a> | 
                <a href="#" onclick="pre()">上一页</a> | 
                <a href="#" onclick="next()">下一页</a> | 
                <a href="#" onclick="last()">尾页</a>
                <span>第<%= books.getCurPage() %>页,共<%= books.getTotalPage() %>页</span>
            </td>
        </tr>
        
        <%-- 隐藏字段 --%>
        <input type="hidden" name="curPage" id="curPage" value="<%= books.getCurPage() %>">
        <input type="hidden" name="totalPage" id="totalPage" value="<%= books.getTotalPage() %>">
    </table>
</form>
</body>
</html>
posted @ 2026-01-27 21:11  LVjiani  阅读(3)  评论(0)    收藏  举报