如何在 Spring MVC 3 中实现分页 [关闭]

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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框架进行分页。

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

有使用它的例子

Swing DisplayTag YUI Datatable Vaadin

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

【讨论】:

以上是关于如何在 Spring MVC 3 中实现分页 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xamarin 表单中实现分页

如何在nodejs + postgresql中实现分页

如何在 dojox.datagrid 中实现分页

如何在排名查询中实现分页?

如何在后端自定义查询中实现分页

如何在 React 中实现分页