Весна с тимелиновой нумерацией листов
1. обзор
В этом кратком руководстве мы создадим простое приложение дляdisplay a list of items with pagination using Spring and Thymeleaf.
Чтобы узнать, как интегрировать Thymeleaf со Spring, ознакомьтесь с нашей статьейhere.
2. Maven Зависимости
Помимо обычных зависимостей Spring, мы добавим зависимости для Thymeleaf и Spring Data Commons:
org.thymeleaf
thymeleaf-spring5
3.0.9.RELEASE
org.springframework.data
spring-data-commons
2.0.9.RELEASE
Мы можем найти последние зависимостиthymeleaf-spring5 иspring-data-commons в репозитории Maven Central.
3. модели
Наш пример приложения продемонстрирует нумерацию страниц для списка книг.
Сначала давайте определим классBook с двумя полями и конструктором всех аргументов:
public class Book {
private int id;
private String name;
// standard constructor, setters and getters
}
4. обслуживание
Затем мы создадим сервис дляgenerate the paginated book list for the requested page с помощью библиотеки Spring Data Commons:
@Service
public class BookService {
final private List books = 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;
}
}
В вышеупомянутом сервисе мы создали метод для возврата выбранногоPage на основе запрошенной страницы, которая представлена интерфейсом Pageable. КлассPageImpl помогает фильтровать разбитый на страницы список книг.
5. Spring Controller
Нам понадобится контроллер Spring дляretrieve the book list of a selected page when given the page size and current page number.
Чтобы использовать значения по умолчанию для выбранной страницы и размера страницы, мы можем просто получить доступ к ресурсу в/listBooks без каких-либо параметров.
Если требуется какой-либо размер страницы или конкретная страница, мы можем добавить параметрыpage иsize.
Например,/listBooks?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") Optional page,
@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";
}
}
To prepare our pagination for the view, we’ve added model attributes in the Spring controller, включая выбранныйPage и список номеров страниц.
6. Шаблон с тимьяном
Пришло время создать шаблон Thymeleaf“listBooks.html”, которыйdisplays the list of books with pagination based on model attributes from our Spring controller.
Сначала мы перебираем список книг и отображаем их в виде таблицы. Тогда мыshow the pagination when the total number of pages is greater than zero.
Каждый раз, когда мы нажимаем и выбираем страницу, будет отображаться соответствующий список книг с выделенной ссылкой на текущую страницу:
7. Заключение
В этой статье мы продемонстрировали, как можно разбить список на страницы с помощью Thymeleaf с платформой Spring.
Как обычно, доступны все примеры кода, использованные в статьеover on GitHub.