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

Java 使用搜索条件对查询结果分页,java,spring,pagination,thymeleaf,Java,Spring,Pagination,Thymeleaf,在维护用于查找结果的搜索条件的同时,我很难找到如何在分页搜索结果页面之间切换的方法。我有一个单独的页面,其中有一个表单,表单中有几个搜索条件的输入字段,还有一个按钮,用于根据提供的条件检索查询结果。表单下方是一个用于显示结果的表,以及一个分页栏,用于选择要在表中显示的数据页。使用标准按页码和大小请求数据工作正常,分页栏也已经工作。它们唯一的问题是,使用提交按钮将搜索条件从表单传递给控制器,然后当单击分页栏链接切换页面时,搜索条件将空传递给控制器,因为从分页链接点击相同的控制器方法时,表单不会重新

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

Thymeleaf分页条:

<!-- 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>

  • ← 第一
  • 1.
  • 最后的→
控制器方法:

@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";
}
@RequestMapping(value=“/users/search”,method=RequestMethod.GET)
公共字符串搜索(模型模型,@modeldattribute(“条件”)UserSearchCriteria条件,
@RequestParam(name=“page”,required=false,defaultValue=“0”)整数页码,@RequestParam(name=“size”,required=false,defaultValue=“10”)整数页码){
页面结果=userService.findUsers(标准,新页面请求(pageNumber,pageSize));
PageWrapper page=新的PageWrapper(结果,“/users/search”);
model.addAttribute(“结果”,结果);
model.addAttribute(“页面”,第页);
返回“用户”;
}

带有结果的搜索页面截图:

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

@RequestMapping(value=“/users/search”,method=RequestMethod.GET)
公共字符串搜索(模型模型,@modeldattribute(“条件”)UserSearchCriteria条件,@CurrentUrl字符串CurrentUrl,分页){
页面结果=userService.findUsers(标准,新页面请求(pageNumber,pageSize));
PageWrapper页面=新的PageWrapper(结果,当前URL);
model.addAttribute(“结果”,结果);
model.addAttribute(“页面”,第页);
返回“用户”;
}

您好,请附上一些屏幕截图以供参考。我刚刚在第一篇文章底部的链接后面添加了一个屏幕截图。从分页结果中,您可以使用url传递搜索结果?和&对于${page.url?searchRes=“+您需要传递的值”}然后从控制器接收使用请求参数的请求,否则可以使用ajax,这样就可以使用post,而不会公开URL。我最终使用Pradeep建议的类似方法解决了这个问题。我使用PageWrapper类来处理在分页栏中构建链接的逻辑,并且我能够传递到这个包装每个包含所有搜索参数的当前url。以前我只使用基本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";
}