举例详解用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日

相关文章

  • SpringSecurity 表单登录的实现

    实现SpringSecurity表单登录需要以下步骤: 导入依赖 需要在项目中导入SpringSecurity相关的依赖包,例如: <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-w…

    Java 2023年5月20日
    00
  • Java面试经验+最新BAT面试资料分享给大家(小结)

    Java面试经验+最新BAT面试资料分享给大家(小结) 这篇文章将帮助大家准备BAT公司的Java面试,希望对大家有所帮助。 程序员面试的模式 程序员面试一般分为以下几轮: 简历筛选 笔试 技术面试 综合素质面试 HR面试 针对每一轮面试,我们都需要做好充足的准备。 简历筛选 在简历筛选阶段,我们需要注意以下几个点: 简历的格式需要清晰简洁,突出重点 突出自…

    Java 2023年5月20日
    00
  • Java集合和数组的区别

    Java集合和数组的区别 数组的特点 数组在使用前必须要给定大小,且大小不可变。 数组可以存储基本类型和类类型,但存储类型必须一致。 数组在创建时会在内存中占用连续的空间,因此在插入或删除元素时不可避免地会牵扯到大量的数组复制操作。 下面是一个创建整数数组并赋初值的示例代码: int[] nums = new int[]{1, 2, 3, 4, 5}; 集合…

    Java 2023年5月26日
    00
  • Java通过jersey实现客户端图片上传示例

    下面是实现“Java通过jersey实现客户端图片上传示例”的攻略。 准备工作 确保已经安装好Java开发环境和Maven。 在Maven中加入Jersey的依赖,例如: <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-serv…

    Java 2023年5月19日
    00
  • Java类加载器的作用是什么?

    Java类加载器的作用是将类文件加载到内存中,并使其能够被Java虚拟机识别。在Java中,类的加载是在其被首次引用时完成的,而类加载器则是负责协调和完成这个任务的组件。 Java类加载器的主要作用包括: 将.class文件加载到JVM中 确定每个类在JVM中的唯一性 保证不同类的可见性 实现类的动态加载和卸载 实现Java程序的模块化开发 Java类加载器…

    Java 2023年5月11日
    00
  • Tomcat配置及如何在Eclipse中启动

    下面我将详细讲解Tomcat配置及如何在Eclipse中启动的完整攻略。 1. Tomcat配置 Tomcat是开源的Web应用程序服务器,它可以为使用Java Servlet和JSP的Web应用程序提供运行环境。在使用Tomcat之前,需要进行配置。 1.1 下载Tomcat 首先需要在Tomcat官网下载Tomcat安装包,下载地址为http://tom…

    Java 2023年5月19日
    00
  • Java将Object转换为数组的代码

    要将Java中的Object类型转换成数组,可以使用Java的反射机制来实现。具体的步骤如下: 1. 获取Object的Class对象 通过Object的getClass()方法获取一个Class对象,然后调用Class类的getComponentType()方法获取数组元素的类型,最后调用java.lang.reflect.Array的newInstanc…

    Java 2023年5月26日
    00
  • eclipse中怎么去掉xml/js验证?

    为了去掉Eclipse中的XML和JS验证,需要按照以下步骤进行操作: 打开Eclipse,并选择菜单“Window -> Preferences” 在“Preferences”窗口中,选择“Validation”选项。 在“Validation”选项卡中,取消选中“Build automatically”复选框。 在下方的“Validators”列表…

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