1. Обзор
В этом кратком руководстве мы создадим простое приложение для отображения списка элементов с разбиением на страницы с помощью Spring и Thymeleaf .
Для ознакомления с тем, как интегрировать Thymeleaf с Spring, пожалуйста, ознакомьтесь с нашей статьей здесь .
2. Зависимости Maven
Помимо обычных зависимостей Spring, мы добавим зависимости для Thymeleaf и Spring Data Commons:
org.thymeleaf thymeleaf-spring5 3.0.11.RELEASE org.springframework.data spring-data-commons 2.3.2.RELEASE
Мы можем найти последние зависимости thymeleaf-spring 5 и spring-data-commons в центральном репозитории Maven.
3. Модели
Наш пример приложения продемонстрирует разбиение на страницы для списка книг.
Во-первых, давайте определим класс Book с двумя полями и конструктором всех аргументов:
public class Book { private int id; private String name; // standard constructor, setters and getters }
4. Обслуживание
Затем мы создадим сервис для генерации разбитого на страницы списка книг для запрашиваемой страницы с помощью библиотеки Spring Data Commons:
@Service public class BookService { final private Listbooks = BookUtils.buildBooks(); public Page findPaginated(Pageable pageable) { int pageSize = pageable.getPageSize(); int currentPage = pageable.getPageNumber(); int startItem = currentPage * pageSize; List list; if (books.size() < startItem) { list = Collections.emptyList(); } else { int toIndex = Math.min(startItem + pageSize, books.size()); list = books.subList(startItem, toIndex); } Page bookPage = new PageImpl (list, PageRequest.of(currentPage, pageSize), books.size()); return bookPage; } }
В приведенном выше сервисе мы создали метод для возврата выбранной страницы на основе запрошенной страницы, которая представлена интерфейсом Pageable . Класс PageImpl помогает отфильтровать разбитый на страницы список книг.
5. Пружинный контроллер
Нам понадобится пружинный контроллер, чтобы получить список книг выбранной страницы при заданном размере страницы и текущем номере страницы .
Чтобы использовать значения по умолчанию для выбранной страницы и размера страницы, мы можем просто получить доступ к ресурсу по адресу /список книг , без каких-либо параметров.
Если требуется какой-либо размер страницы или конкретная страница, мы можем добавить параметры page и size .
Например, /список книг?page=2&size=6 будет извлекать вторую страницу с шестью элементами на странице:
@Controller public class BookController { @Autowired private BookService bookService; @RequestMapping(value = "/listBooks", method = RequestMethod.GET) public String listBooks( Model model, @RequestParam("page") Optionalpage, @RequestParam("size") Optional size) { int currentPage = page.orElse(1); int pageSize = size.orElse(5); Page bookPage = bookService.findPaginated(PageRequest.of(currentPage - 1, pageSize)); model.addAttribute("bookPage", bookPage); int totalPages = bookPage.getTotalPages(); if (totalPages > 0) { List pageNumbers = IntStream.rangeClosed(1, totalPages) .boxed() .collect(Collectors.toList()); model.addAttribute("pageNumbers", pageNumbers); } return "listBooks.html"; } }
Чтобы подготовить нашу разбиение на страницы для представления, мы добавили атрибуты модели в Spring controller , включая выбранную страницу и список номеров страниц.
6. Шаблон Thymeleaf
Теперь пришло время создать шаблон Thymeleaf “listBooks.html” , который отображает список книг с разбиением на страницы на основе атрибутов модели из нашего весеннего контроллера .
Сначала мы перебираем список книг и выводим их в виде таблицы. Затем мы показываем разбиение на страницы, когда общее количество страниц больше нуля .
Каждый раз, когда мы нажимаем и выбираем страницу, соответствующий список книг будет отображаться с выделенной ссылкой на текущую страницу:
7. Заключение
В этой статье мы продемонстрировали, как можно разбить список на страницы с помощью Thymeleaf с помощью Spring framework.
Как обычно, все примеры кода, используемые в статье, доступны на GitHub .