如何在Spring MVC 3中实现分页

时间:2010-02-11 14:26:39

标签: java spring spring-mvc servlets pagination

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

6 个答案:

答案 0 :(得分:87)

查看来自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 :(得分:11)

我一直在寻找一种方法,但没有找到任何标准组件或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发出请求,您将在请求中获得寻呼机对象。

答案 2 :(得分:4)

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

它基本上归结为将firstrow(要在页面中显示的第一行的索引)作为请求参数传递,并在分页表单中有两个按钮/链接,这些按钮/链接在/ {递减firstrow使用rowcount(页面中一次显示的行数)与SQL查询结合使用,该查询在每个LIMITOFFSET子句或子选项的帮助下返回结果的子集或具体功能,具体取决于所讨论的数据库。有关详细的代码示例和SQL查询,请参阅上面链接的答案。

答案 3 :(得分:4)

您是否听说过Spring Data JPA项目?使用Pagable接口有一个很好的灵活解决方案。我发现它是实现清洁,无样板分页的最简单方法。请访问Spring Data JPA homepage了解更多信息。

答案 4 :(得分:3)

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

答案 5 :(得分:2)

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

虽然它不是很成功,但也许某人可能有兴趣尝试它。

有与

一起使用的示例

在线示例有点过时,最好从sourceforge下载jdal-samples文件。