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 @@
-