最近在做一个小程序,用到了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="#">«</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="#">»</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=
今天的文章jsp页面分页显示数据_数据库分页查询分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/71444.html