我正在使用Fremarker进行分页。这是传呼机makros:
<#macro pager url page>
<#if page.getTotalPages() gt 7>
<#assign
totalPages = page.getTotalPages()
pageNumber = page.getNumber() + 1
head = (pageNumber > 4)?then([1, -1], [1, 2, 3])
tail = (pageNumber < totalPages - 3)?then([-1, totalPages], [totalPages - 2, totalPages - 1, totalPages])
bodyBefore = (pageNumber > 4 && pageNumber < totalPages - 1)?then([pageNumber - 2, pageNumber - 1], [])
bodyAfter = (pageNumber > 2 && pageNumber < totalPages - 3)?then([pageNumber + 1, pageNumber + 2], [])
body = head + bodyBefore + (pageNumber > 3 && pageNumber < totalPages - 2)?then([pageNumber], []) + bodyAfter + tail
>
<#else>
<#assign body = 1..page.getTotalPages()>
</#if>
<div class="container-fluid mt-3">
<div class="row">
<ul class="pagination col">
<li class="page-item disabled">
<a class="page-link" href="#" tabindex="-1">Pages</a>
</li>
<#list body as p>
<#if (p - 1) == page.getNumber()>
<li class="page-item active">
<a class="page-link" href="#" tabindex="-1">${p}</a>
</li>
<#elseif p == -1>
<li class="page-item disabled">
<a class="page-link" href="#" tabindex="-1">...</a>
</li>
<#else>
<li class="page-item">
<a class="page-link" href="${url}?page=${p - 1}&size=${page.getSize()}" tabindex="-1">${p}</a>
</li>
</#if>
</#list>
</ul>
<ul class="pagination col justify-content-end">
<li class="page-item disabled">
<a class="page-link" href="#" tabindex="-1">Elements per page</a>
</li>
<#list [20, 40, 80, 120] as c>
<#if c == page.getSize()>
<li class="page-item active">
<a class="page-link" href="#" tabindex="-1">${c}</a>
</li>
<#else>
<li class="page-item">
<a class="page-link" href="${url}?page=${page.getNumber()}&size=${c}" tabindex="-1">${c}</a>
</li>
</#if>
</#list>
</ul>
</div>
</div>
</#macro>
分页网址如下所示:
http:// localhost:8080 / main?page = 1&size = 10
主页具有搜索功能:
<@c.page>
<div class="form-row">
<div class="form-group col-md-6">
<form method="get" action="/main" class="form-inline">
<input type="text" name="filter" class="form-control" value="${filter?ifExists}"
placeholder="Search by tag"/>
<button type="submit" class="btn btn-primary ml-2">Search</button>
</form>
</div>
</div>
</@c.page>
如果输入搜索,URL将如下所示:
http:// localhost:8080 / main?filter = search-param
但是,分页不适用于已输入搜索参数的URL(实际上称为过滤器)。
尝试在上添加以下内容pager.ftl
:
<#if '${url}'?contains("filter")>
<a class="page-link" href="${url}&page=${p - 1}&size=${page.getSize()}" tabindex="-1">${p}</a>
<#else>
<a class="page-link" href="${url}?page=${p - 1}&size=${page.getSize()}" tabindex="-1">${p}</a>
</#if>
想法是检查URL是否设置了过滤器参数->向其添加分页:
http:// localhost:8080 / main?filter = search-param&page = 1&size = 10
如果没有搜索参数,请使用默认参数。
而且它没有用。
Spring Boot和Spring Data的后端逻辑工作得很好。
尝试了@ddekany的解决方案。结果如下:
<#else>
<li class="page-item">
<a class="page-link"
href="${url}${url?contains('?')?then('&', '?')}page=${p - 1}&size=${page.getSize()}"
tabindex="-1">
${p}
</a>
</li>
</#if>
第二部分:
<#else>
<li class="page-item">
<a class="page-link"
href="${url}${url?contains('?')?then('&', '?')}page=${page.getNumber()}&size=${c}"
tabindex="-1">
${c}
</a>
</li>
</#if>
这是你输入搜索的时间:
但是,当你按2
搜索页面时,你将被重定向到主页(搜索为空而不是转到搜索结果的第二页):
解决方案:
在控制器上正确设置URL:
Page<MessageDto> page = messageService.messageList(pageable, filter, user);
if (StringUtils.isNotBlank(filter)) {
model.addAttribute("url", String.format("/main?filter=%s", filter));
} else {
model.addAttribute("url", "/main");
}
model.addAttribute("page", page);
model.addAttribute("filter", filter);
return "main";
并在传呼机上更改设置的URL:
<li class="page-item">
<#--<a class="page-link" href="${url}?page=${p - 1}&size=${page.getSize()}" tabindex="-1">${p}</a>-->
<a class="page-link" href="${url}${url?contains('?')?then('&', '?')}page=${p - 1}&size=${page.getSize()}" tabindex="-1">
${p}
</a>
</li>
和
<li class="page-item">
<#--<a class="page-link" href="${url}?page=${page.getNumber()}&size=${c}" tabindex="-1">${c}</a>-->
<a class="page-link" href="${url}${url?contains('?')?then('&', '?')}page=${page.getNumber()}&size=${c}" tabindex="-1">
${c}
</a>
</li>
带注释的行是旧代码。取消注释是完全有效的。
问题是如何为这种功能配置Fremarker?
再次检查,因为这样#if
应该可以。
但是,我会寻找?
,因为它比寻找更健壮filter
,因为即使以后重命名该参数,它也能正常工作。
另外,<#if '${url}'?contains('...')>
可以写成<#if url?contains('...')>
。
实际上,你可能不想重复整行,只是为了替换单个字符,所以只需编写
href="${url}${url?contains('?')?then('&', '?')}page=...
。
(你可以在Freemarker演示中快速测试这些东西)
此更新后,分页将停止工作。更新了代码查找的答案。
@ catch23删除
<#if url?contains('filter')>
标签和相应的</#if>
标签。我的观点是,您不需要#if
,而是可以将其他东西与一起使用?then
。另外,如果您说出了到底发生了什么,而不是“停下来工作”之类的话,获得答案的机会就会大大增加。