如何在 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】:看看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);
【讨论】:
(+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
(要在页面中显示的第一行的索引)作为请求参数传递,并在分页表单中有两个按钮/链接,它们在/减少firstrow
和rowcount
(在页面中一次显示的行数)结合 SQL 查询,该查询在每个 LIMIT
、OFFSET
子句或子选择或特定函数的帮助下返回结果的子集,具体取决于数据库题。有关详细的代码示例和 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 中实现分页 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章