Mola com paginação Thymeleaf para uma lista
1. Visão geral
Neste tutorial rápido, construiremos um aplicativo simples paradisplay a list of items with pagination using Spring and Thymeleaf.
Para obter uma introdução sobre como integrar o Thymeleaf com o Spring, dê uma olhada em nosso artigohere.
2. Dependências do Maven
Além das dependências usuais do Spring, adicionaremos as dependências para Thymeleaf e Spring Data Commons:
org.thymeleaf
thymeleaf-spring5
3.0.9.RELEASE
org.springframework.data
spring-data-commons
2.0.9.RELEASE
Podemos encontrar as dependênciasthymeleaf-spring5espring-data-commons mais recentes no repositório Maven Central.
3. Modelos
Nosso aplicativo de amostra demonstrará a paginação de uma lista de livros.
Primeiro, vamos definir uma classeBook com dois campos e um construtor de todos os argumentos:
public class Book {
private int id;
private String name;
// standard constructor, setters and getters
}
4. Serviço
Em seguida, criaremos um serviço paragenerate the paginated book list for the requested page usando a biblioteca 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;
}
}
No serviço acima, criamos um método para retornar osPage selecionados com base na página solicitada, que é representada pela interface Pageable. A classePageImpl ajuda a filtrar a lista paginada de livros.
5. Spring Controller
Precisaremos de um controlador Spring pararetrieve the book list of a selected page when given the page size and current page number.
Para usar os valores padrão para a página e o tamanho da página selecionados, podemos simplesmente acessar o recurso em/listBooks, sem quaisquer parâmetros.
Se qualquer tamanho de página ou página específica for necessário, podemos adicionar os parâmetrospageesize.
Por exemplo,/listBooks?page=2&size=6 recuperará a página dois com seis itens por página:
@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, incluindo oPage selecionado e uma lista de números de página.
6. Modelo Thymeleaf
Agora é hora de criar um modelo de Thymeleaf“listBooks.html”, quedisplays the list of books with pagination based on model attributes from our Spring controller.
Primeiro, iteramos a lista de livros e os exibimos em uma tabela. Então nósshow the pagination when the total number of pages is greater than zero.
Sempre que clicar e selecionar uma página, a lista correspondente de livros será exibida com o link da página atual destacado:
7. Conclusão
Neste artigo, demonstramos como podemos paginar uma lista usando o Thymeleaf com a estrutura Spring.
Como de costume, todos os exemplos de código usados no artigo estão disponíveisover on GitHub.