如何在Spring MVC 3中实现分页

Nac*_*ket 56 java spring pagination servlets spring-mvc

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

Pas*_*ent 87

看看PagedListHolder和其他课程 org.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • (+1)该死的,我不知道那里有.我必须已经实现了至少3次这个功能,而且它已经...... (14认同)
  • 很酷的例子,只是寻找类似的东西;).您可以使用RequestParam注释进一步简化它,因此不需要Request和Response对象.因此,方法签名看起来像`public ModelAndView handleRequest(@RequestParam(required = false)String keyword,@ RequestParam(required = false)String page,HttpSession session)`.Spring将执行getParameter部分并使用相应的值填充这些字段.同样,它将直接传递HttpSession对象. (4认同)
  • @Nachiket创建后,`PagedListHolder`对象放在Session中,分页实际上是在内存对象中完成的.这回答了你的问题了吗?如果没有,你能澄清一下吗? (2认同)

Daf*_*aff 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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