有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javaspring数据分页与AJAX

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

@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}

我是否应该将页码作为@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) 个答案

  1. # 1 楼答案

    我知道这篇文章很长一段时间都不活跃,但对于仍在寻找将Spring分页与Ajax结合使用的方法的人来说,以下是一些可能的解决方案:

    1如果您的存储库是JpaRepository(或者更准确地说PagingAndSortingRepository)的实例,那么您只需将Pageable传递给它:

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

    2您也可以将分页参数检索为@RequestParam并自己创建一个PageRequest,而不是Pageable。如果项目不使用Spring数据和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数据there is a dialect自动添加分页

  2. # 2 楼答案

    对于REST服务,我将把它放在参数中,而不是放在URIpage\u start=X&;页面大小=Y