リストのためのThymeleafのページ付けを伴う春

リストのThymeleafページネーションで春

1. 概要

このクイックチュートリアルでは、display a list of items with pagination using Spring and Thymeleafへの簡単なアプリケーションを作成します。

ThymeleafをSpringと統合する方法の概要については、記事hereをご覧ください。

2. Mavenの依存関係

通常のSpringの依存関係に加えて、ThymeleafとSpring DataCommonsの依存関係を追加します。


    org.thymeleaf
    thymeleaf-spring5
    3.0.9.RELEASE


    org.springframework.data
    spring-data-commons
    2.0.9.RELEASE

Maven Centralリポジトリで最新のthymeleaf-spring5spring-data-commonsの依存関係を見つけることができます。

3. モデル

サンプルアプリケーションは、書籍のリストのページネーションを示します。

まず、2つのフィールドとすべての引数を持つコンストラクターを使用してBookクラスを定義しましょう。

public class Book {
    private int id;
    private String name;

    // standard constructor, setters and getters
}

4. サービス

次に、Spring Data Commonsライブラリを使用してgenerate the paginated book list for the requested pageへのサービスを作成します。

@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. スプリングコントローラー

retrieve the book list of a selected page when given the page size and current page numberのSpringコントローラーが必要です。

選択したページとページサイズのデフォルト値を使用するには、パラメータなしで/listBooksのリソースにアクセスするだけです。

ページサイズまたは特定のページが必要な場合は、パラメーターpageおよびsizeを追加できます。

たとえば、/listBooks?page=2&size=6は、ページごとに6つのアイテムを持つページ2を取得します。

@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";
    }
}

選択したPageとページ番号のリストを含むTo prepare our pagination for the view, we’ve added model attributes in the Spring controller

6. Thymeleafテンプレート

次に、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です。