JSP分页显示数据

最近在做一个小程序,用到了JSP的分页。虽然只是最简单的分页,但是还是花了我不少时间。这看似简单的功能,实现起来还是稍微有点麻烦。实现分页功能,需要知道数据的总个数,每页应该有多少条数据,以及当前页码。假如总共有300条数据,每页20条,那么应该就有15页;假设有301条数据,每页20条,这时候就需要16页。因此,总页数可以这样计算:总页数=数据总数%每页条数==0?数据总数/每页条数:数据总数/每页条数+1。为了能显示当前页的数据,我们需要知道当前页码,然后根据当前页码计算应该显示哪些数据。因此,我们还需要一个参数来跟踪当前页码。

知道了这些,就可以开始分页的实现了。

简单分页

首先来看看最简单的分页。我们先不考虑数据库如何分页,假设现在我们直接获取到了所有数据,只考虑如何将这些数据分页。

后端代码

首先我们需要一个实体类,其他方法已省略。

public class User {
   
    private int id;
    private String name;
    private String password;
    private LocalDate birthday;
}

然后需要一个数据访问层的接口:

public interface UserRepository {
   
    List<User> listAll();
}

然后我们来实现这个接口,作为我们的数据源。

public class MemoryUserRepository implements UserRepository {
   
    public static final int COUNTS = 302;

    @Override
    public List<User> listAll() {
   
        List<User> users = new ArrayList<>();
        for (int i = 0; i < COUNTS; ++i) {
   
            User user = new User();
            user.setId(i + 1);
            user.setName("用户" + i + 1);
            user.setPassword("12345" + i);
            user.setBirthday(LocalDate.now());
            users.add(user);
        }
        return users;
    }
}

然后我们需要一个Servlet,来计算总页数等这些分页相关的变量,然后将分页信息传递给JSP。这个分页非常简单,实际上是利用了List接口的subList方法来切分数据,而这个方法需要接受子列的起始索引和结束索引组成的闭开区间,所以我们需要计算本页起始用户序号和本页末尾用户序号的下一个。如果数据有零头,不够一整页,那么我们就需要判断一下末尾序号是否超过了列表的大小。

@WebServlet(name = "ListAllServlet", urlPatterns = {
   "/list"})
public class ListAllServlet extends HttpServlet {
   
    private List<User> users;
    private UserRepository repository;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        String p = req.getParameter("page");
        int page;
        try {
   
            //当前页数
            page = Integer.valueOf(p);
        } catch (NumberFormatException e) {
   
            page = 1;
        }
        //用户总数
        int totalUsers = users.size();
        //每页用户数
        int usersPerPage = 20;
        //总页数
        int totalPages = totalUsers % usersPerPage == 0 ? totalUsers / usersPerPage : totalUsers / usersPerPage + 1;
        //本页起始用户序号
        int beginIndex = (page - 1) * usersPerPage;
        //本页末尾用户序号的下一个
        int endIndex = beginIndex + usersPerPage;
        if (endIndex > totalUsers)
            endIndex = totalUsers;
        req.setAttribute("totalUsers", totalUsers);
        req.setAttribute("usersPerPage", usersPerPage);
        req.setAttribute("totalPages", totalPages);
        req.setAttribute("beginIndex", beginIndex);
        req.setAttribute("endIndex", endIndex);
        req.setAttribute("page", page);
        req.setAttribute("users", users);
        req.getRequestDispatcher("list.jsp").forward(req, resp);
    }

    @Override
    public void init() throws ServletException {
   
        repository = new MemoryUserRepository();
        users = repository.listAll();
    }
}

上面这个Servlet中的list.jsp就是我们具体显示的页面了。下面我们要做的就是处理前端了。

前端代码

分页组件

首先来看看前端如何分页。我在这里用的前端框架是Bootstrap,它也提供了一个分页组件pagination,只需要在页面中添加如下一段代码。

<nav>
  <ul class="pagination">
    <li><a href="#">&laquo;</a></li>
    <li><a href="#">1</a></li>
    <li><a href="#">2</a></li>
    <li><a href="#">3</a></li>
    <li><a href="#">4</a></li>
    <li><a href="#">5</a></li>
    <li><a href="#">&raquo;</a></li>
  </ul>
</nav>

当然,这段代码是静态的,我们要让它产生动态的行为,就需要放到JSP中进行处理。

JSP代码

下面是我的JSP代码。我用了JSTL来做JSP的扩展,因此在项目中还需要添加JSTL的包。为了简洁,我将一些不相关的代码写在了其它JSP中,然后包含进来。_header.jsp是引入Bootstrap的一些代码。_navbar.jsp_footer.jsp则是可选的导航条和页脚,没有也罢。

然后是一堆<c:set>,设置了我们分页要使用的一些变量。currentPageUsers这个变量做了实际的分页工作。

然后,我用了一个表格来显示当前页的数据。用到了JSTL的<c:forEach>标签。

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>简单分页</title>
    <%@include file="_header.jsp" %>
</head>
<body>
<%@include file="_navbar.jsp" %>
<div class="container">

    <c:set var="totalUsers" value="${requestScope.totalUsers}"/>
    <c:set var="usersPerPage" value="${requestScope.usersPerPage}"/>
    <c:set var=
  • 79
    点赞
  • 300
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
JSP中实现分页显示数据的步骤如下: 1. 在JSP页面中使用JSTL标签库中的<c:forEach>标签或者JSP自带的<% %>标签,遍历数据集合并将数据显示在页面上。 2. 在页面上添加分页导航条,用于用户切换不同页面的数据。可以通过<a>标签或者<button>标签来实现。 3. 在后台代码中,根据用户请求的当前页码以及每页显示数据量,计算出要显示数据的起始位置和结束位置。 4. 从数据源中查询数据,并根据起始位置和结束位置来限制查询结果的数量。 5. 将查询结果封装成JavaBean对象,然后将JavaBean对象放入请求作用域(request)中,以便在JSP页面中遍历和显示。 6. 在JSP页面中根据分页导航条传递的参数,重新查询数据显示在页面上。 示例代码如下: ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JSP分页显示数据</title> </head> <body> <h1>用户列表</h1> <table> <tr> <th>ID</th> <th>用户名</th> <th>邮箱</th> </tr> <c:forEach var="user" items="${users}"> <tr> <td>${user.id}</td> <td>${user.username}</td> <td>${user.email}</td> </tr> </c:forEach> </table> <br> <div> <c:if test="${currentPage > 1}"> <a href="list.jsp?page=${currentPage - 1}">上一页</a> </c:if> <c:forEach begin="1" end="${totalPage}" varStatus="status"> <c:choose> <c:when test="${status.index == currentPage}"> <span>${status.index}</span> </c:when> <c:otherwise> <a href="list.jsp?page=${status.index}">${status.index}</a> </c:otherwise> </c:choose> </c:forEach> <c:if test="${currentPage < totalPage}"> <a href="list.jsp?page=${currentPage + 1}">下一页</a> </c:if> </div> </body> </html> ``` 在后台代码中,我们需要根据参数page和pageSize来计算出要查询的数据的起始位置和结束位置,然后从数据源中查询数据,并将查询结果封装成JavaBean对象放入请求作用域中。 ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page import="com.example.User" %> <% int currentPage = Integer.parseInt(request.getParameter("page")); int pageSize = 10; int totalCount = 100; int totalPage = (totalCount + pageSize - 1) / pageSize; int startIndex = (currentPage - 1) * pageSize; int endIndex = startIndex + pageSize; List<User> users = new ArrayList<User>(); for (int i = startIndex; i < endIndex && i < totalCount; i++) { User user = new User(); user.setId(i + 1); user.setUsername("user" + (i + 1)); user.setEmail("user" + (i + 1) + "@example.com"); users.add(user); } request.setAttribute("users", users); request.setAttribute("currentPage", currentPage); request.setAttribute("totalPage", totalPage); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JSP分页显示数据</title> </head> <body> <%@ include file="list.jsp" %> </body> </html> ``` 在JSP页面中,我们需要根据请求作用域中的数据来渲染分页导航条和数据列表。 注意:为了防止SQL注入等安全问题,我们在实际开发中应该使用PreparedStatement来查询数据,并对用户输入的参数进行过滤和验证。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值