yagibrary

あだ名のやぎと図書館のlibraryを組み合わせてyagibraryです。本から学んだことをみなさんに紹介します。

【読書メモ】【プロになるためのSpring入門】第11章 Spring MVC + Thymeleaf その2

その1に関してはこちらの記事を見てください。
yagibrary.hatenablog.com

第11章 Spring MVC + Thymeleaf

11.7 ハンドラメソッドと@XxxMapping

ハンドラメソッドは、リクエストと紐づいたControllerクラスのメソッドのことを指します。ハンドラメソッドを作成するには、Controllerクラスの中に適当なメソッドを作成した後、@XxxMappingというアノテーションを付ければよいです。

@GetMappingや@PostMappingはSpring Frameworkのバージョン4.3から登場したアノテーションです。

11.8 リクエストパラメータの取得

ハンドラメソッドでは、リクエストパラメータの値を引数で受け取ることができます。

▼例11.2 リクエストパラメータのサンプル

pageNo=1&maxCount=10

例11.2のリクエストパラメータの値を受け取るハンドラメソッドのサンプルをソース11.10に示します。

▼ソース11.10 リクエストパラメータを受け取るハンドラメソッド

@XxxMapping("/display-list")
public String displayList(@RequestParam("pageNo") int pNo, @RequestParam("maxCount") int max) {
    ...

また、@RequestParamとは別の方法でリクエストパラメータを取得することも可能です。まず、任意のクラスを作成し、プロパティ名*1をリクエストパラメータ名に合わせます(ソース11.13)。

▼ソース11.13 リクエストパラメータの値を格納するクラス

public class PageInput {
    private Integer pageNo;
    private Integer maxCount;
    ... Getter・Setterメソッド

作成したクラスの型をハンドラメソッドの引数で定義します(ソース11.14)。

▼ソース11.14 値を格納するクラスを引数で定義したハンドラメソッド

@XxxMapping("/display-list")
public String displayList(PageInput pageInput) {
    ...

例11.2のリクエストパラメータが送信されると、ハンドラメソッドが呼ばれる前にPageInputクラスのオブジェクトが自動的に作成され、パラメータの値がプロパティに設定されます。

リクエストパラメータの数が多い場合に、スッキリとソースコードを記述することができます。

11.9 Viewへのデータの渡し方

11.10 Thymeleafでデータを参照

Trainingオブジェクトが、「title」「startDateTime」「reserved」のプロパティを持っています。これらのプロパティをHTMLに埋め込んでいるテンプレートファイルのサンプルをソース11.17に示します。

▼ソース11.17 Modelオブジェクトのデータを参照

<table>
  <tr>
    <th>研修タイトル</th>
    <td><span th:text="${training.title}"></span></td></tr>
  <tr>
    <th>開始日時</th>
    <td><span th:text="${#temporals.format(training.startDateTime, 'yyyy/MM/dd HH:mm')}"></span></td>
  </tr>
  <tr>
    <th>予約数</th>
    <td><span th:text="${training.reserved}"></span></td></tr>

❷の行では、「#temporals.format」という記述がされています。「#」マークはThymeleafが保持する汎用的なオブジェクトにアクセスするための記述です。temporalsは、日時データを扱うのに便利なオブジェクトです。

11.11 Listオブジェクトの参照

まずはModelオブジェクトの中にListオブジェクトを格納します。ソース11.19にサンプルを示します。

▼ソース11.19 ListオブジェクトをModelオブジェクトに格納

@GetMapping("/display-list")
public String displayList(Model model) {
    List<Training> trainings = trainingService.findAll();
    model.addAttribute("trainingList", trainings);
    return "training/trainingList";
}

11.12 入力画面と入力チェック

*1:Getterメソッドで取得したり、Setterメソッドで更新できるデータのことを、Javaではプロパティと呼びます。xxx(先頭小文字)がプロパティ名になります。