diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml index 6e0b7f6545..61d41e5f20 100644 --- a/spring-thymeleaf/pom.xml +++ b/spring-thymeleaf/pom.xml @@ -98,6 +98,13 @@ ${springframework-security.version} test + + + + org.springframework.data + spring-data-commons + ${springFramework-data.version} + @@ -117,7 +124,7 @@ true - jetty8x + jetty9x embedded @@ -157,6 +164,7 @@ 4.3.4.RELEASE 4.2.0.RELEASE + 2.0.7.RELEASE 3.1.0 3.0.9.RELEASE diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java index 4c69a60b8e..b8132cddc8 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java @@ -5,6 +5,10 @@ import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.IntStream; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; + import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @@ -12,8 +16,7 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import com.baeldung.thymeleaf.model.Book; -import com.baeldung.thymeleaf.model.Page; -import com.baeldung.thymeleaf.utils.BookUtils; +import com.baeldung.thymeleaf.service.BookService; @Controller public class BookController { @@ -21,22 +24,20 @@ public class BookController { private static int currentPage = 1; private static int pageSize = 5; + @Autowired + private BookService bookService; + @RequestMapping(value = "/listBooks", method = RequestMethod.GET) public String listBooks(Model model, @RequestParam("page") Optional page, @RequestParam("size") Optional size) { page.ifPresent(p -> currentPage = p); size.ifPresent(s -> pageSize = s); - List books = BookUtils.buildBooks(); - Page bookPage = new Page(books, pageSize, currentPage); + Page bookPage = bookService.findPaginated(PageRequest.of(currentPage - 1, pageSize)); - model.addAttribute("books", bookPage.getList()); - model.addAttribute("selectedPage", bookPage.getCurrentPage()); - model.addAttribute("pageSize", pageSize); + model.addAttribute("bookPage", bookPage); int totalPages = bookPage.getTotalPages(); - model.addAttribute("totalPages", totalPages); - - if (totalPages > 1) { + if (totalPages > 0) { List pageNumbers = IntStream.rangeClosed(1, totalPages) .boxed() .collect(Collectors.toList()); diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/service/BookService.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/service/BookService.java new file mode 100644 index 0000000000..2aaa559251 --- /dev/null +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/service/BookService.java @@ -0,0 +1,38 @@ +package com.baeldung.thymeleaf.service; + +import java.util.Collections; +import java.util.List; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import com.baeldung.thymeleaf.model.Book; +import com.baeldung.thymeleaf.utils.BookUtils; + +@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; + + } +} diff --git a/spring-thymeleaf/src/main/webapp/WEB-INF/views/listBooks.html b/spring-thymeleaf/src/main/webapp/WEB-INF/views/listBooks.html index 3f102c545c..c32854af3e 100644 --- a/spring-thymeleaf/src/main/webapp/WEB-INF/views/listBooks.html +++ b/spring-thymeleaf/src/main/webapp/WEB-INF/views/listBooks.html @@ -32,7 +32,7 @@ - @@ -40,11 +40,11 @@ -