使用搜索条件分页查询结果

时间:2017-08-16 15:20:11

标签: java spring pagination thymeleaf

我无法确定如何在分页搜索结果页面之间切换,同时保持用于查找结果的搜索条件。我有一个页面,其中包含一个表单,其中包含用于多个搜索条件的输入字段,以及一个用于根据提供的条件检索查询结果的按钮。表单下方是一个显示结果的表格和一个分页栏,用于选择要在表格中显示的数据页面。按标准按页码和大小请求数据工作正常,分页栏也已经有效。他们唯一的问题是搜索条件是使用提交按钮从表单传递给控制器​​,然后当单击分页栏链接到切换页面时,搜索条件将被传递给控制器​​为空,因为表单未重新提交时从分页链接中击中相同的控制器方法。基本上,每当我使用分页链接时,我都会切换页面,但所有搜索条件都会丢失,所以我最终会在没有应用搜索条件的情况下对所有结果进行分页。如何在使用分页链接切换页面时保持搜索条件?

Thymeleaf Pagination Bar:

<!-- Pagination Bar -->
        <div th:fragment='paginationbar' th:if="${results}">
            <div>
                <ul class='pagination pagination-centered'>
                    <li th:class="${page.firstPage}?'disabled':''">
                    <span th:if='${page.firstPage}'>← First</span>
                    <a th:if='${not page.firstPage}' th:href='@{${page.url}(page=0,size=${page.size})}'>← First</a>
                    </li>
                    <li th:class="${page.hasPreviousPage}? '' : 'disabled'">
                    <span th:if='${not page.hasPreviousPage}'>«</span>
                    <a th:if='${page.hasPreviousPage}' th:href='@{${page.url}(page=${page.currentNumber-2},size=${page.size})}' title='Go to previous page'>«</a>
                    </li>
                    <li th:each='item : ${page.items}' th:class="${item.current}? 'active' : ''">
                    <span th:if='${item.current}' th:text='${item.number}'>1</span>
                    <a th:if='${not item.current}' th:href='@{${page.url}(page=${item.number-1},size=${page.size})}'><span th:text='${item.number}'>1</span></a>
                    </li>
                    <li th:class="${page.hasNextPage}? '' : 'disabled'">
                    <span th:if='${not page.hasNextPage}'>»</span>
                    <a th:if='${page.hasNextPage}' th:href='@{${page.url}(page=${page.currentNumber},size=${page.size})}' title='Go to next page'>»</a>
                    </li>
                    <li th:class="${page.lastPage}? 'disabled' : ''">
                    <span th:if='${page.lastPage}'>Last →</span>
                    <a th:if='${not page.lastPage}' th:href='@{${page.url}(page=${page.totalPages - 1},size=${page.size})}'>Last →</a>
                    </li>
                </ul>
            </div>
        </div>

控制器方法:

@RequestMapping(value="/users/search", method=RequestMethod.GET)
public String search(Model model, @ModelAttribute("criteria") UserSearchCriteria criteria, 
        @RequestParam(name="page", required=false, defaultValue="0") Integer pageNumber, @RequestParam(name="size", required=false, defaultValue="10") Integer pageSize) {

    Page<User> results = userService.findUsers(criteria, new PageRequest(pageNumber, pageSize));
    PageWrapper<User> page = new PageWrapper<User>(results, "/users/search");
    model.addAttribute("results", results);
    model.addAttribute("page", page);
    return "users";
}

带搜索结果的搜索页面的屏幕截图:https://i.stack.imgur.com/njJ3P.png

1 个答案:

答案 0 :(得分:0)

最初我只是将搜索路径的基本URL传递给我的控制器方法中的PageWrapper(没有任何搜索参数)。我传递的这条路径用于构建分页栏中包含的链接。我发现相反,我可以传递用于到达包含搜索参数的封闭控制器方法的完整当前URL。将此传递给PageWrapper允许分页链接包含搜索参数。 (我的问题是我不知道我可以使用搜索参数检索完整的当前URL。@ CurrentUrl注释是自定义的,并从HttpServletRequest中解析当前的URL。)

@RequestMapping(value="/users/search", method=RequestMethod.GET)
public String search(Model model, @ModelAttribute("criteria") UserSearchCriteria criteria, @CurrentUrl String currentUrl, Paging paging) {

    Page<User> results = userService.findUsers(criteria, new PageRequest(pageNumber, pageSize));
    PageWrapper<User> page = new PageWrapper<User>(results, currentUrl);
    model.addAttribute("results", results);
    model.addAttribute("page", page);
    return "users";
}