【问题标题】:How to implement pagination in Spring MVC 3 [closed]如何在 Spring MVC 3 中实现分页 [关闭]
【发布时间】:2011-01-15 17:54:46
【问题描述】:

是否有任何开箱即用、易于实现的标准分页组件/标签库或代码示例可用于 Spring MVC 中的分页?

【问题讨论】:

    标签: java spring spring-mvc servlets pagination


    【解决方案1】:

    看看PagedListHolderorg.springframework.beans.support 的其他课程。

    请参阅示例中的 JPetstore 以获取一些示例,例如在SearchProductsController.java:

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String keyword = request.getParameter("keyword");
        if (keyword != null) {
            if (!StringUtils.hasLength(keyword)) {
                return new ModelAndView("Error", "message", "Please enter a keyword to search for, then press the search button.");
            }
            PagedListHolder productList = new PagedListHolder(this.petStore.searchProductList(keyword.toLowerCase()));
            productList.setPageSize(4);
            request.getSession().setAttribute("SearchProductsController_productList", productList);
            return new ModelAndView("SearchProducts", "productList", productList);
        }
        else {
            String page = request.getParameter("page");
            PagedListHolder productList = (PagedListHolder) request.getSession().getAttribute("SearchProductsController_productList");
            if (productList == null) {
                return new ModelAndView("Error", "message", "Your session has timed out. Please start over again.");
            }
            if ("next".equals(page)) {
                productList.nextPage();
            }
            else if ("previous".equals(page)) {
                productList.previousPage();
            }
            return new ModelAndView("SearchProducts", "productList", productList);
        }
    }
    

    【讨论】:

    • (+1) 该死的,我不知道它在那里。我必须至少实现了 3 次该功能,而且它已经在那里......
    • 酷,顺便问一下,你能解释一下,在 SearchProductsController 代码示例中如何需要 session 吗?我浏览了无法使用它的代码。
    • @Nachiket 创建后,PagedListHolder 对象被放入 Session 中,分页实际上是在内存中的对象上完成的。这回答了你的问题了吗?如果不是,你能澄清一下吗?
    • 很酷的例子,只是在寻找类似的东西;)。您可以通过使用 RequestParam 注释进一步简化它,因此不需要 Request 和 Response 对象。因此方法签名看起来像public ModelAndView handleRequest(@RequestParam (required = false) String keyword, @RequestParam(required = false) String page, HttpSession session)。然后 Spring 将执行 getParameter 部分并使用相应的值填充这些字段。同样,它会直接传递 HttpSession 对象。
    • 这意味着如果同一用户打开另一个搜索窗口,他将不会获得其他独立的结果集,因为它们已绑定到会话?
    【解决方案2】:

    我也在寻找一种方法来做到这一点,但没有找到任何标准组件或 taglib。我认为主要是因为分页可以变得非常具体,因为您已经需要从数据库中通过分页来检索数据(如果您使用的是 Hibernate,则可以使用 Criteria API 轻松地做到这一点)。我想出了这样的事情:

    public class Pager
    {
        private int page;
        private int results;
        private String sortOrder;
        private String sortColumn;
    
        // Getters and setters
    }
    
    @Controller
    public class StuffController
    {
        @Autowired SomeEntityService someEntityService;
    
        @RequestMapping("/test.html", method = Method.GET)
        public void getStuffPaged(@RequestParam("id") String id, Pager pager, ModelMap mm)
        {
            mm.addAttribute("entities", someEntityService.get(id, pager));
        }
    }
    

    如果您现在向http://domain/app/test.html?id=10&page=1&results=30&sortOrder=asc 执行请求,您将在请求中获得寻呼机对象。

    【讨论】:

    • 我没有使用休眠,但它很酷.. 好一个.. :)
    • 迄今为止最好的答案!绑定分页参数的简洁方法,也可以在没有休眠的情况下使用!
    • 你可以使用 Spring 默认提供的 Pageable 而不是 Pager
    【解决方案3】:

    您听说过 Spring Data JPA 项目吗?使用 Pagable 接口有一个很好的灵活解决方案。我发现它是实现干净、无样板分页的最简单方法。在Spring Data JPA homepage 上查看更多信息。

    【讨论】:

    • 我查看了该链接,但没有发现任何针对此目的的内容
    【解决方案4】:

    没有人想到,Google 也没有透露任何具体的组件(尽管它提供了非常具体的示例和提示)。但理论上只有一堆按钮和一个(或两个)请求参数就绰绰有余了。然后让 SQL/DB 完成它的工作。我已经在here 之前在 JSP/Servlet/DAO 上下文中发布了类似问题的答案。

    它基本上归结为将firstrow(要在页面中显示的第一行的索引)作为请求参数传递,并在分页表单中有两个按钮/链接,它们在/减少firstrowrowcount (在页面中一次显示的行数)结合 SQL 查询,该查询在每个 LIMITOFFSET 子句或子选择或特定函数的帮助下返回结果的子集,具体取决于数据库题。有关详细的代码示例和 SQL 查询,请参阅前面链接的答案。

    【讨论】:

      【解决方案5】:

      Here's a link to the Spring Data JPA reference docs,他们有一个非常干净的网页分页方法。

      【讨论】:

      • 太棒了,谢谢。是否支持按列搜索?
      • 是的。 Repos 支持 findByXxx()、findByXxx(Pageable) 等,其中 xxx 是列。
      【解决方案6】:

      前段时间我发布了一个开源java库,专注于使用spring框架进行分页。

      虽然不是很成功,但也许有人有兴趣尝试一下。

      有使用它的例子

      网上的例子有些陈旧,最好从sourceforge下载jdal-samples文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-21
        • 2011-05-05
        • 2020-04-11
        • 1970-01-01
        • 1970-01-01
        • 2019-02-27
        • 2012-06-03
        • 1970-01-01
        相关资源
        最近更新 更多