举例详解用Java实现web分页功能的方法

我来详细讲解一下“举例详解用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">&laquo;</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">&raquo;</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">&laquo;</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">&raquo;</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技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 计算机网络高频面试八股文

    网络分层结构 计算机网络体系大致分为三种,OSI七层模型、TCP/IP四层模型和五层模型。一般面试的时候考察比较多的是五层模型。最全面的Java面试网站 五层模型:应用层、传输层、网络层、数据链路层、物理层。 应用层:为应用程序提供交互服务。在互联网中的应用层协议很多,如域名系统DNS、HTTP协议、SMTP协议等。 传输层:负责向两台主机进程之间的通信提供…

    Java 2023年4月19日
    00
  • java基础之方法详解

    下面我将详细讲解“Java基础之方法详解”的完整攻略。 方法基础 在Java语言中,方法是一段可调用的独立代码块,用于完成特定的功能逻辑。在完整的Java程序中,每个方法都被封装在一个类中,方法被定义为类的成员变量。 方法的定义格式如下: [访问修饰符] [返回值类型] 方法名([参数列表]) { // 方法体 [return 返回值;] } 其中,访问修饰…

    Java 2023年5月19日
    00
  • Java读取数据库表

    Java读取数据库表 package com.easycrud.builder; import com.easycrud.utils.PropertiesUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.sql.*; /** * @BelongsProjec…

    Java 2023年5月2日
    00
  • jsp中session过期设置及web.xml配置学习

    下面是关于“jsp中session过期设置及web.xml配置学习”的完整攻略: 1. session过期设置 1.1 什么是session过期? 在jsp开发中,session在很多场合都扮演了非常重要的角色,他可以用来存储用户的登录状态、用户浏览过的历史页面、用户购物车等等。但是,session也会因为一些原因来使其“死亡”,也就是所谓的过期失效。 1.…

    Java 2023年6月15日
    00
  • Java反射 PropertyDescriptor类案例详解

    “Java反射 PropertyDescriptor类案例详解”中,主要是对Java反射中的PropertyDescriptor类进行讲解,该类主要是用于访问JavaBean类的属性信息(就是通过get、set方法设置的属性),并可以会根据JavaBean对象来调用对应属性的get、set方法。下面详细介绍该攻略的完整过程。 1. PropertyDescr…

    Java 2023年6月15日
    00
  • ES6 Symbol数据类型的应用实例分析

    ES6 Symbol 数据类型的应用实例分析 Symbol 是 ES6 新增的数据类型,用于表示独一无二的值。它经常被用于表示对象的私有属性,也可以用于定义对象的方法。本文将详细讲解 Symbol 数据类型的应用实例。 1. 定义对象的私有属性 JavaScript 中没有原生的私有属性的概念,但是使用 Symbol 数据类型可以模拟出私有属性的效果。下面是…

    Java 2023年5月26日
    00
  • Java中redis的基本类型

    以下是 “Java中redis的基本类型”的详细攻略。 什么是Redis Redis是一个开源的基于键值对存储的NoSQL数据库系统。它支持字符串、列表、集合、有序集合、哈希表等数据类型,同时也支持发布订阅、事务、Lua脚本等高级功能。Redis的主要优势是性能高、稳定性强,同时支持丰富的数据类型和数据结构。 Redis中的基本数据类型 字符串类型 Redi…

    Java 2023年5月20日
    00
  • java读取XML文件的四种方法总结(必看篇)

    下面是针对“java读取XML文件的四种方法总结(必看篇)”这篇攻略的详细讲解。 提供四种方法 该攻略提供了使用Java读取XML文件的四种方法,分别是: 使用SAX方式解析XML文件 使用DOM方式解析XML文件 使用JDOM方式解析XML文件 使用XMLBeans方式解析XML文件 对于每种方法,攻略都提供了详细的介绍和示例代码,并且针对各种场景,推荐了…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部