Посмотрите на 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);
}
}
Никто не приходит в голову, и Google также не обнаруживает каких-либо конкретных компонентов для этого (хотя он дает довольно много конкретных примеров и подсказок). Но теоретически всего набора кнопок и одного (или двух) параметров запроса более чем достаточно. Тогда позвольте SQL / DB делать свою работу. Я опубликовал ответ на аналогичный вопрос в контексте JSP / Servlet / DAO до здесь .
Это в основном сводится к передаче firstrow
(индекс первой строки, которая будет отображаться на странице) в качестве параметра запроса и наличия двух кнопок / ссылок в форме разбивки на страницы, которая увеличивает / уменьшает firstrow
с rowcount
(количество строк, отображаемых одновременно на странице) в сочетании с запросом SQL, который возвращает подмножество результатов с помощью под каждым LIMIT
, Предложение OFFSET
, или подзапросы, или конкретные функции, в зависимости от рассматриваемой БД. См. Вышеупомянутый ответ для подробных примеров кода и SQL-запросов.
Я тоже искал способ сделать это, но не нашел ни одного стандартного компонента или библиотеки тегов. Я думаю, в основном потому, что разбиение на страницы может стать очень конкретным, поскольку вам уже нужно извлекать данные с помощью подкачки из базы данных (если вы используете 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
, вы получите пейджер Возражение в вашем запросе.