【Spring Boot学习】08、实现分页功能

具体业务场景参照:【SpringBoot仿牛客网】02、开发社区首页

0 需求分析

在这里插入图片描述

要实现分页,传给页面的数据要有:
指定行数的内容(即:当前页面内容)
分页区页码范围(如图中的1-5页)
当前页码
每页显示多少条数据
一共有多少条数据

需要的数据很多很繁琐,我们直接把这些数据封装成一个实体类Page,在浏览器请求时通过model将page对象传入Controller方法中,赋予page对象属性,再通过model将page对象传入动态模板中,供页面使用

1 Page类

/**
 * 封装分页相关的信息
 */
public class Page {
    private int current=1;//当前页码
    private int limit=10;//每页显示多少数据
    private int rows;//总共有多少条数据
    private int showPages=5;//下面的页码一次显示5页
    private String path;

    public int getShowPages() {
        return showPages;
    }

    public void setShowPages(int showPages) {
        if(showPages<=20 && showPages>=1) {
            this.showPages = showPages;
        }
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public int getRows() {
        return rows;
    }

    public void setRows(int rows) {
        if(rows>=0) {
            this.rows = rows;
        }
    }

    public int getCurrent() {
        return current;
    }

    public void setCurrent(int current) {
        if(current>=1) {
            this.current = current;
        }
    }

    public int getLimit() {
        return limit;
    }

    public void setLimit(int limit) {
        if(limit>=1 && limit<=100) {
            this.limit = limit;
        }
    }

    /**
     * 获取总共有多少页
     */
    public int getTotal(){
        if(rows%limit==0)
            return rows/limit;
        else
            return rows/limit+1;
    }

    //页面上要显示从几页到几页
    /**
     * 获取起始显示页
     */
    public int getStartPage(){
        int start = current-2;
        //如果current是最后两页,前面就多显示几页
        int total=getTotal();
        if(total-start<=showPages-1)
            start=total-showPages+1;

        return start<1?1:start;
    }
    /**
     * 获取终止显示页
     */
    public int getEndPage(){
        int end = current+2;
        //如果current是最前面两页,后面就多显示几页
        end=end<showPages?showPages:end;

        int total=getTotal();
        return end>total?total:end;
    }

    /**
     * 起始查询行
     */
    public int getStartRow(){
        return (current-1)*limit;
    }
}

2 Controller方法

//访问首页
@RequestMapping(path = "/index",method = RequestMethod.GET)
public String getIndex(Model model, Page page){
    //这俩属性没有默认值,需要自己设定
    page.setRows(discussService.findRowsCount(0));
    page.setPath("/index");//用于前端的链接,格式为/index?current=1

    List<DiscussPost> list = discussService.findDiscussPost(0,page.getStartRow(),page.getLimit());
    List<Map<String,Object>> discussPosts = new ArrayList<>();
    if(!list.isEmpty()){
        for(DiscussPost post:list){
            Map<String, Object> map = new HashMap<>();
            //帖子
            map.put("post",post);
            User user = userService.findUserById(post.getUserId());
            map.put("user", user);
            discussPosts.add(map);
        }
    }
    model.addAttribute("discussPosts",discussPosts);
    return "/index";
}

3 动态模板

index.html分页部分

<!-- 分页 -->
<nav class="mt-5" th:if="${page.rows>page.limit}" th:fragment="pagination">
	<ul class="pagination justify-content-center">
		<li class="page-item">
			<a class="page-link" th:href="@{|${page.path}?current=1|}">首页</a>
		</li>
		<li th:class="|page-item ${page.current==1?'disabled':''}|">
			<a class="page-link" th:href="@{${page.path}(current=${page.current-1})}">上一页</a></li>
		<li th:class="|page-item ${i==page.current?'active':''}|" th:each="i:${#numbers.sequence(page.startPage,page.endPage)}">
			<a class="page-link" th:href="@{${page.path}(current=${i})}" th:text="${i}">1</a>
		</li>
		<li th:class="|page-item ${page.current==page.total?'disabled':''}|">
			<a class="page-link" th:href="@{${page.path}(current=${page.current+1})}">下一页</a>
		</li>
		<li class="page-item">
			<a class="page-link" th:href="@{${page.path}(current=${page.total})}">末页</a>
		</li>
	</ul>
</nav>

4 复用分页模块

以后想复用分页模块很简单
1.在对应的Controller方法里传入Page page,设置page.setRows()和page.setPath()
2.在动态页面复用index.html的分页部分
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot提供了很多方式来实现分页查询的功能,以下是其中的两种方式: 1. 使用Spring Data JPA 使用Spring Data JPA可以很方便地实现分页查询的功能Spring Data JPA提供了Pageable接口和Page类来支持分页查询。 首先,在Repository接口中定义一个方法,方法名以“findBy”开头,后面跟着要查询的属性名,然后再跟着Pageable类型的参数,如下所示: ```java @Repository public interface UserRepository extends JpaRepository<User, Long> { Page<User> findByName(String name, Pageable pageable); } ``` 然后,在Controller中使用@GetMapping注解实现分页查询,如下所示: ```java @GetMapping("/users") public Page<User> getUsers(@RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "10") int size) { Pageable pageable = PageRequest.of(page, size); return userRepository.findByName("张三", pageable); } ``` 其中,PageRequest.of()方法用于创建Pageable对象,第一个参数是页数,从0开始计数,第二个参数是每页显示的记录数。userRepository.findByName()方法用于查询数据并返回Page对象。 2. 使用MyBatis 使用MyBatis可以通过分页插件PageHelper来实现分页查询的功能。 首先,在pom.xml文件中添加PageHelper的依赖: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> ``` 然后,在Mapper接口中定义一个方法,方法名以“findBy”开头,后面跟着要查询的属性名,然后再跟着Page类型的参数,如下所示: ```java @Mapper public interface UserMapper { List<User> findByName(String name, Page page); } ``` 然后,在Controller中使用@GetMapping注解实现分页查询,如下所示: ```java @GetMapping("/users") public PageInfo<User> getUsers(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize) { Page page = PageHelper.startPage(pageNum, pageSize); List<User> users = userMapper.findByName("张三", page); return new PageInfo<>(users); } ``` 其中,PageHelper.startPage()方法用于创建Page对象并设置分页参数,第一个参数是页数,从1开始计数,第二个参数是每页显示的记录数。userMapper.findByName()方法用于查询数据并返回List对象。最后,使用PageInfo类来包装List对象并返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值