SSH框架下实现分页查询的PageResultSet类与PageInfo类解析

1星 需积分: 9 7 下载量 84 浏览量 更新于2024-07-27 收藏 62KB DOC 举报
"SSH分页实现教程" 在Java Web开发中,SSH(Struts2、Spring、Hibernate)是一个常见的开源框架组合,用于构建高效、可扩展的企业级应用。本实例将介绍如何利用SSH框架来实现分页功能,提高用户体验并优化数据库查询性能。 首先,我们来看一下分页的核心类`PageResultSet`。这个类是用来封装查询结果和分页信息的容器。`PageResultSet<T>`是一个泛型类,允许存储任何类型的数据集合。`list`字段存储了当前页的数据,而`pageInfo`字段则包含了与分页相关的详细信息,如总记录数、总页数等。 ```java public class PageResultSet<T> { private List<T> list; private PageInfo pageInfo; // getters and setters } ``` 接着,我们定义了`PageInfo`类,用于存储分页的详细信息: ```java public class PageInfo { private int totalRow; // 总记录数 private int totalPage; // 总页数 private int currentPage = 1; // 当前页,默认为1 private int pageSize = 20; // 页的大小 private boolean hasPrevious; private boolean hasNext; private boolean bof; // 是否在页首 private boolean eof; // 是否在页尾 // 构造方法和其他相关方法 } ``` 在SSH框架中,通常我们会使用Hibernate作为持久层框架,它提供了一种基于HQL(Hibernate Query Language)的分页查询方式。在服务层(Service Layer),我们需要编写一个方法,该方法接收当前页数和每页大小作为参数,然后调用Hibernate的`setFirstResult()`和`setMaxResults()`方法来实现分页。 ```java public PageResultSet<User> getUsersByPage(int currentPage, int pageSize) { Session session = sessionFactory.getCurrentSession(); Criteria criteria = session.createCriteria(User.class); criteria.setFirstResult((currentPage - 1) * pageSize); criteria.setMaxResults(pageSize); List<User> userList = criteria.list(); // 计算总页数和总记录数 Long totalRows = (Long) criteria.setProjection(Projections.rowCount()).uniqueResult(); int totalPage = (int) Math.ceil((double) totalRows / pageSize); PageInfo pageInfo = new PageInfo(); pageInfo.setTotalRow(totalRows.intValue()); pageInfo.setTotalPage(totalPage); pageInfo.setCurrentPage(currentPage); pageInfo.setPageSize(pageSize); // 设置hasPrevious、hasNext、bof、eof状态 // ... PageResultSet<User> result = new PageResultSet<>(); result.setList(userList); result.setPageInfo(pageInfo); return result; } ``` 在表现层(Presentation Layer),即Struts2控制器,我们将调用服务层的方法,并将返回的`PageResultSet`对象传递给视图层(View Layer)。视图层通常是一个JSP页面,可以通过EL表达式或Struts2标签来显示分页信息和数据。 ```jsp <display:table name="pageResultSet.list" export="false" pagesize="${pageResultSet.pageSize}" requestURI="/users.action"> <!-- 表格内容 --> </display:table> <!-- 分页链接 --> <display:pagination page="pageResultSet.currentPage" totalPages="pageResultSet.totalPage" /> ``` 至此,SSH框架下的分页功能就实现了。通过这样的设计,我们能够轻松地在前端展示分页数据,并且在后端有效地管理数据库查询,避免一次性加载大量数据导致的性能问题。同时,`PageResultSet`和`PageInfo`类的定义使得分页逻辑更加清晰,易于维护。