freemarker模板分页处理

发布时间 2023-06-01 16:44:31作者: 下课后我要去放牛

借鉴博客:https://www.cnblogs.com/zhouyu629/p/12433259.html

 

 

1、创建一个分页页面:page.html,里面只有分页的内容

<#macro fpage page pagesize totalpages totalrecords url>
    <li><span>共${totalrecords}条记录 &nbsp;&nbsp;第${page}页/共${totalpages}页</span></li>

    <#assign startpage = page,endpage=10,showfirstpage=false,showlastpage=false,showpre=false,shownext=false,prepage = 1,nextpage=11>
    <#--是否显示首页按钮及计算初始页码-->
    <#if page gt 1>
        <#assign showfirstpage = true>
        <#--startpage向前挪4页,如果不足4页,则startpage=1-->
        <#assign startpage=(page-4)>
        <#if startpage lte 0>
        <#assign startpage = 1>
        </#if>
    </#if>
    <#--是否显示前n页的...,以及...的链接-->
    <#if page gt 5>
        <#assign showpre = true,prepage=page-5>
    </#if>
    <#--计算endpage-->
    <#if page+pagesize-1 lt totalpages>
        <#assign endpage = page+pagesize-1>
        <#--显示后面的...按钮-->
        <#assign shownext = true>
        <#--后面...的页面码-->
        <#assign nextpage=page+pagesize>
        <#--显示末页-->
        <#assign showlastpage = true>
        <#else>
        <#assign endpage = totalpages>
    </#if>
    <#if endpage lte 0>
        <#assign endpage = 1>
    </#if>



    <#--开始展示-->

    <#--首页-->
    <#if showfirstpage>
        <li class="page-item"><span><a class="page-link" href="${url}&page=1">首页</a></span></li>
    </#if>
    <#--前面的...-->
    <#if showpre>
        <li class="page-item"><span><a class="page-link" href="${url}&page=${prepage}">...</a></span></li>
    </#if>
    <#--显示的页码按钮-->
    <#list startpage..endpage as p>
        <li  class="page-item <#if p == page>active</#if>"><span><a class="page-link" href="${url}&page=${p}">${p}</a></span></li>
    </#list>
    <#--后面的...-->
    <#if shownext>
        <li class="page-item"><span><a class="page-link" href="${url}&page=${nextpage}">...</a></span></li>
    </#if>
    <#--显示尾页-->
    <#if showlastpage>
        <li class="page-item"><span><a class="page-link" href="${url}&page=${totalpages}">末页</a></span></li>
    </#if>

</#macro>

 

 

2、然后在list页面,就是要分页的模板页面嵌套page.html页面

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
    <title>Hello World!</title>
</head>
<body>



<div style="border: 1px solid darkred">

    <div style="border: 1px solid blue;">
        <h3>自定义分页</h3>

    <!-- 自定义标签areaTag -->
        <@areaTag pageNum='${pageNum}'>
        <ul>

            <#if data.getList()?? &&(data?size>0)>
                <#list data.getList() as item>
                    <li>${item.name}</li>
                </#list>
            </#if>

        </ul>

        <!-- 嵌套分页page.html页面 -->
        <ul>
            <#import "page.html" as fpage />
            <@fpage.fpage page=data.pageNum pagesize=data.pageSize totalpages=data.pages totalrecords=data.total url="freemarkerTest1?key=" />
        </ul>
        </@areaTag>


    </div>



</div>


<!--<script src="/static/jquery/jquery-2.1.4.js"></script>-->
<!--<script src="jquery/jquery-2.1.4.js"></script>-->

<!--<script src="bootstrap/js/bootstrap.js"></script>-->

<!--<script src="jquery/jquery-3.2.0.js"></script>-->

<style>
    
</style>

</body>
</html>

 

 

3、在显示数据的页面中,用了自定义标签areaTag,后台java自定义areaTag代码:freemarker自定义标签写法还要其他配置代码,太多就懒得写出来了,这里只是关键代码,java返回数据的原理都一样,只要返回指定的分页对象数据

package com.jzproject.common.freemarker.directive;

import com.github.pagehelper.PageInfo;
import com.jzproject.common.freemarker.interf.FreemarkerComponent;
import com.jzproject.model.TArea;
import com.jzproject.service.IAreaService;
import freemarker.core.Environment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

@FreemarkerComponent("areaTag")
@Component
public class AreaDirective extends BaseDirective {

    @Autowired
    private IAreaService iAreaService;

    @Override
    public Object doExecute(Environment env, Map params) {
        String pageNum = params.get("pageNum") == null ? "1" : params.get("pageNum").toString();
        String pageSize = params.get("pageSize") == null ? "3" : params.get("pageSize").toString();

        List<TArea> list = iAreaService.queryAreaList(430000);

        PageInfo pageInfo = startPage(list, Integer.parseInt(pageNum), Integer.parseInt(pageSize));

        return pageInfo;
    }



    /**
    * descript: 自定义分页
    * @author: zhouruntao
    * @date: 2023-05-31 11:22
    *
    **/
    public <T> PageInfo<T> startPage(List<T> list, Integer pageNum, Integer pageSize) {
        //创建Page类
        com.github.pagehelper.Page page = new com.github.pagehelper.Page(pageNum, pageSize);
        //为Page类中的total属性赋值
        page.setTotal(list.size());
        //计算当前需要显示的数据下标起始值
        int startIndex = (pageNum - 1) * pageSize;
        int endIndex = Math.min(startIndex + pageSize, list.size());
        //从链表中截取需要显示的子链表,并加入到Page
        page.addAll(list.subList(startIndex,endIndex));
        //以Page创建PageInfo
        PageInfo pageInfo = new PageInfo<>(page);
        return pageInfo;
    }



}

 

 

 

4、效果如图: