Warm tip: This article is reproduced from serverfault.com, please click

url-具有搜索参数的Freemarker分页

(url - Freemarker pagination with Search parameter)

发布于 2020-11-28 20:57:17

我正在使用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

如果没有搜索参数,请使用默认参数。

而且它没有用。

这是GitHub上的完整项目资源

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?

Questioner
catch23
Viewed
0
13.5k 2020-11-29 19:13:22

再次检查,因为这样#if应该可以。

但是,我会寻找?,因为它比寻找更健壮filter,因为即使以后重命名该参数,它也能正常工作。

另外,<#if '${url}'?contains('...')>可以写成<#if url?contains('...')>

实际上,你可能不想重复整行,只是为了替换单个字符,所以只需编写

href="${url}${url?contains('?')?then('&', '?')}page=...

(你可以在Freemarker演示中快速测试这些东西