Spring Data Pagination& AJAX

时间:2015-06-16 03:13:10

标签: java ajax spring pagination

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

@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工具上选择“next”或“previous”可以启动它自己的GET

<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?我可能会在这里感到困惑 - 欢迎任何意见!谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我知道这篇文章很长时间没有活动,但是对于仍在寻找使用Spring分页方式的人来说,这里有一些可能的解决方案:

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自动添加分页。