【问题标题】:Spring Data Pagination & AJAXSpring 数据分页和 AJAX
【发布时间】:2015-06-16 03:13:10
【问题描述】:

我有以下控制器,我刚刚在返回的结果中包含了分页

@RequestMapping(value = "/search/{person}", produces="application/json", method = RequestMethod.GET)
    public Page<Person> findAllPersons(@PathVariable String person) {
    Page<Person> list = personRepo.findAll(new PageRequest(1, PAGE_SIZE));
    return list;
}

我现在正试图弄清楚如何在这些结果中实际使用标签 - 对 Person 表的搜索是它自己的 AJAX 请求,因为在我的 UI 工具上选择“下一个”或“上一个”可以启动它自己的获取

<a id="previous" href="onclick="setPageNumber(1)">
<a id="next" href="onclick="setPageNumber(2)">
function setPageNumber(num) { //relaunch request with page number value retrieved from previous or next}

我是否应该像这样将 pageNumber 包含为 @PathVariable

@RequestMapping(value = "/search/{person}/{pageNumber}", produces="application/json", method = RequestMethod.GET)
public Page<Person> findAllPersons(@PathVariable String person, @PathVariable int pageNumber) {
    Page<Person> list = personRepo.findAll(new PageRequest(pageNumber, PAGE_SIZE));
    return list;
}

或者应该将 pageNumber 设置为一个完全独立的控制器方法,以某种方式使用 pageNumber 参数调用findAllPersons?我可能在这里感到困惑 - 欢迎任何意见谢谢!

【问题讨论】:

    标签: java ajax spring pagination


    【解决方案1】:

    对于 REST 服务,我会将其放入参数而不是 URI page_start=X&page_size=Y

    【讨论】:

      【解决方案2】:

      我知道这篇文章很长一段时间都没有活跃,但对于仍在寻找一种将 Spring 分页与 Ajax 结合使用的方法的任何人,这里有一些可能的解决方案:

      1.如果您的存储库是JpaRepository(或更准确地说是PagingAndSortingRepository)的实例,那么您可以简单地将Pageable 传递给它:

      @Controller
      public class FooController {
      
          //...
      
          @GetMapping("/foo/list")
          public List<Foo> handleList(Pageable pageable) {
              return fooRepository.findAll(pageable);
          }
      
          //...
      }
      

      2. 除了Pageable,您还可以将您的分页参数检索为@RequestParam,并自己创建一个PageRequest。如果项目不使用 Spring Data 和 JPA,这种方法可能很有用:

      @Controller
      public class FooController {
      
          //...
      
          @GetMapping("/foo/list")
          public List<Foo> handleList(
              @RequestParam(value = "size", required = false) Optional<Integer> pageSize,
              @RequestParam(value = "page", required = false) Optional<Integer> pageNumber,
              @RequestParam(value = "sort", required = false) Sort sort,
          ) {
              PageRequest pageable = new PageRequest(pageNumber.orElse(0), pageSize.orElse(10), sort);
              return fooRepository.customfindAll(pageable);
          }
      
          //...
      }
      

      (例如,上面的这个存储库可能是一个扩展 JDBCRepository 的类,例如 this one

      对于这两种可能的解决方案的 AJAX 部分,可以使用类似的东西:

      // ... handle pageNo, listSize etc.
      
      var url = '/yourprj/foo/list?page=' + pageNo + '&size=' + listSize
      $.ajax({
          type: "GET",
          contentType: "application/json",
          url: url,
          success: function(result) {
              // handle Foo list...
          }
      });
      

      3. 或者,如果您使用 Thymeleaf+Spring Data there is a dialect 自动添加分页。

      【讨论】:

        猜你喜欢
        • 2020-03-11
        • 2019-08-31
        • 2020-03-04
        • 2015-07-24
        • 2017-12-20
        • 2013-12-20
        • 1970-01-01
        • 2021-03-02
        • 2018-09-29
        相关资源
        最近更新 更多