如何在Spring MVC 3中实现分页
是否有任何开箱即用,易于实现的标准分页组件/标签库或代码示例可用于在Spring MVC分页?
查看org.springframework.beans.support
中的PagedListHolder
和其他类。
查看示例中的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); } }
我正在寻找一种方法来做到这一点,但没有find任何标准组件或标签库。 我认为主要是因为分页可以变得非常具体,因为你需要从数据库中分页检索你的数据(如果你使用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
您将在请求中获得寻呼机对象。
没有人想到, 谷歌也没有透露任何具体的组件(虽然它提供了非常具体的例子和提示)。 但从理论上讲,只有一堆button和一个(或两个)请求参数就足够了。 然后让SQL / DB做它的工作。 在此之前,我已经在JSP / Servlet / DAO上下文中回答了类似的问题。
它基本上归结为在请求参数周围传递firstrow
(第一行的索引)作为请求参数,并且在分页forms中具有两个button/链接,其中/行与第一行(第一行显示的行rowcount
页)结合一个SQL查询返回一个结果的子集,在每个LIMIT
, OFFSET
子句或子查询或特定函数的帮助下,取决于所讨论的DB。 有关详细的代码示例和SQL查询,请参阅上述答案。
你有没有听说过Spring Data JPA项目? 使用Pagable接口有一个很好的灵活的解决scheme。 我发现这是实现干净无模板分页的最简单的方法。 查看更多Spring Data JPA主页 。
这里有一个链接到Spring Data JPA参考文档 ,他们有一个非常干净的网页分页方法。
我前段时间发表了一个开源的java库,专注于Spring框架的分页。
虽然它不是很成功,也许有人可能有兴趣尝试它。
有一些使用它的例子
- 摇摆
- DisplayTag
- YUI数据表
- Vaadin
在线示例已经过时了,最好从sourceforge下载jdal-samples文件。