freemarker模板分页处理
借鉴博客:https://www.cnblogs.com/zhouyu629/p/12433259.html
1、创建一个分页页面:page.html,里面只有分页的内容
<#macro fpage page pagesize totalpages totalrecords url> <li><span>共${totalrecords}条记录 第${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、效果如图:
。