我来详细讲解一下“举例详解用Java实现web分页功能的方法”的完整攻略。下面我将按照步骤一一说明,包含两条示例。
1. 在Java Web应用中实现分页
在Java Web应用中实现分页的基本思路是:查询需要分页的数据,然后根据页面大小和当前页码将数据切分成多个子集,最后将某个子集的数据展示在页面上。整个过程可以通过以下步骤实现:
1.1 定义分页查询参数
定义查询参数包括页面大小和当前页码等信息。在Java中,可以通过一个POJO(Plain Old Java Object)类来表示这些参数。示例代码如下:
public class PageParam {
// 页面大小
private int pageSize;
// 当前页码
private int currentPage;
// getter 和 setter 略
}
1.2 查询总记录数
在分页查询前,需要先查询总记录数,以便计算总页数。可以使用SQL语句或ORM框架(如Mybatis)来实现。示例代码如下:
public int getTotalCount() {
// 执行查询总记录数的SQL或Mybatis Mapper
return totalCount;
}
1.3 计算总页数
根据页面大小和总记录数,可以计算出总页数。示例代码如下:
public int getTotalPages(int pageSize) {
return (int) Math.ceil(totalCount / (pageSize *
1.0));
}
1.4 分页查询数据
根据页面大小和当前页码,可以计算出需要查询的数据范围。可以使用SQL语句或ORM框架(如Mybatis)来实现。示例代码如下:
public List<T> getData(int pageSize, int currentPage) {
// 计算需要查询的数据范围
int start = (currentPage - 1) * pageSize;
int end = (currentPage * pageSize) > totalCount ?
totalCount : (currentPage * pageSize);
// 执行分页查询的SQL或Mybatis Mapper
return dataList;
}
1.5 页面展示数据
将查询到的数据展示在页面上,可以使用模板引擎(如Thymeleaf)来实现。示例代码如下:
<div th:each="data : ${dataList}">
<p th:text="${data.name}"></p>
<p th:text="${data.age}"></p>
</div>
2. 示例1:使用Mybatis实现web分页功能
下面示例是使用Mybatis框架实现Web分页功能,包含了查询总记录数、计算总页数、分页查询和页面展示数据的完整代码。示例中假设已经建立好了Mybatis的Mapper映射文件和实体类。
2.1 编写Mapper接口
public interface UserMapper {
// 查询总记录数
int countUser();
// 分页查询
List<User> selectUserList(@Param("start") int start,
@Param("pageSize") int pageSize);
}
2.2 编写Mapper映射文件
<mapper namespace="com.example.dao.UserMapper">
<!-- 查询总记录数 -->
<select id="countUser" resultType="int">
select count(*) from user
</select>
<!-- 分页查询 -->
<select id="selectUserList" resultType="User">
select * from user
limit #{start}, #{pageSize}
</select>
</mapper>
2.3 编写DAO接口
public interface UserDao {
int countUser();
List<User> getUserList(int pageSize, int currentPage);
}
2.4 编写DAO实现类
public class UserDaoImpl implements UserDao {
public static final int PAGE_SIZE = 10;
private SqlSession sqlSession;
public UserDaoImpl(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
public int countUser() {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
return mapper.countUser();
}
public List<User> getUserList(int pageSize, int currentPage) {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int start = (currentPage - 1) * PAGE_SIZE;
int end = currentPage * PAGE_SIZE;
return mapper.selectUserList(start, pageSize);
}
}
2.5 编写Service层
@Service
public class UserService {
@Autowired
private UserDao userDao;
public PageResult<User> getUserList(int currentPage) {
PageResult<User> pageResult = new PageResult<>();
int totalCount = userDao.countUser();
int totalPages = (int) Math.ceil(totalCount * 1.0 / UserDaoImpl.PAGE_SIZE);
List<User> userList = userDao.getUserList(UserDaoImpl.PAGE_SIZE, currentPage);
pageResult.setTotalPages(totalPages);
pageResult.setCurrentPage(currentPage);
pageResult.setDataList(userList);
return pageResult;
}
}
2.6 页面展示数据
<!-- 分页 -->
<nav aria-label="Page navigation">
<ul class="pagination">
<li th:classappend="${pageResult.currentPage == 1} ? disabled : ''">
<a th:href="@{/user/list(currentPage=${pageResult.currentPage - 1})}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
<li th:each="i : ${#numbers.sequence(1, pageResult.totalPages)}"
th:classappend="${i == pageResult.currentPage} ? active : ''">
<a th:href="@{/user/list(currentPage=${i})}" th:text="${i}"></a>
</li>
<li th:classappend="${pageResult.currentPage == pageResult.totalPages} ? disabled : ''">
<a th:href="@{/user/list(currentPage=${pageResult.currentPage + 1})}" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</ul>
</nav>
<!-- 数据展示 -->
<div th:each="user : ${pageResult.dataList}">
<p th:text="${user.name}"></p>
<p th:text="${user.age}"></p>
</div>
3. 示例2:使用Spring Data JPA实现web分页功能
下面示例是使用Spring Data JPA框架实现Web分页功能,包含了查询总记录数、计算总页数、分页查询和页面展示数据的完整代码。
3.1 编写Repository接口
public interface UserRepository extends JpaRepository<User, Long> {
}
3.2 编写Service层
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public PageResult<User> getUserList(int currentPage) {
PageResult<User> pageResult = new PageResult<>();
Pageable pageable = PageRequest.of(currentPage - 1, UserDaoImpl.PAGE_SIZE);
int totalCount = (int) userRepository.count();
int totalPages = (int) Math.ceil(totalCount * 1.0 / UserDaoImpl.PAGE_SIZE);
List<User> userList = userRepository.findAll(pageable).getContent();
pageResult.setTotalPages(totalPages);
pageResult.setCurrentPage(currentPage);
pageResult.setDataList(userList);
return pageResult;
}
}
3.3 页面展示数据
<!-- 分页 -->
<nav aria-label="Page navigation">
<ul class="pagination">
<li th:classappend="${pageResult.currentPage == 1} ? disabled : ''">
<a th:href="@{/user/list(currentPage=${pageResult.currentPage - 1})}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
<li th:each="i : ${#numbers.sequence(1, pageResult.totalPages)}"
th:classappend="${i == pageResult.currentPage} ? active : ''">
<a th:href="@{/user/list(currentPage=${i})}" th:text="${i}"></a>
</li>
<li th:classappend="${pageResult.currentPage == pageResult.totalPages} ? disabled : ''">
<a th:href="@{/user/list(currentPage=${pageResult.currentPage + 1})}" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</ul>
</nav>
<!-- 数据展示 -->
<div th:each="user : ${pageResult.dataList}">
<p th:text="${user.name}"></p>
<p th:text="${user.age}"></p>
</div>
以上就是用Java实现web分页功能的完整攻略,分别涉及了Mybatis和Spring Data JPA两种常用框架的实现方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:举例详解用Java实现web分页功能的方法 - Python技术站