yagibrary

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

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

第11章 Spring MVC + Thymeleaf

11.1 MVCとは?

  • Model

業務ロジック、業務的なデータの保持、データベースアクセス(それぞれ、Service、Entity、Repositoryに該当)。

  • View

画面を表示するためのHTMLを作成する(JSPなどのテンプレートファイルに該当)。

  • Controller

リクエストからレスポンスまでの全体の流れを制御する。

11.2 Spring MVCの紹介

Spring MVCは、MVCパターンの考え方に沿って、効率良くWebアプリケーションを作成できるSpringの機能です。主にControllerのプログラムを作成するための機能を提供します。

11.3 Thyemeleafの紹介

Thymeleafの特徴として、HTMLの文法にのっとってテンプレートファイルを作成できることがあります。HTMLのタグの属性として、Thymeleafの構文を埋め込むため、テンプレートファイルを直接ブラウザで開いてもHTMLの文法にのっとっているためレイアウトが崩れません。たとえば、ソース11.1のようなテンプレートファイルを作成したとします。

▼ソース11.1 Thymeleafテンプレートファイルのサンプル

<html>
  <body>
    <h1 th:text="${fullName}">東京太郎</h1>
  </body>
</html>

テンプレートファイルの特徴により、デザイン担当者がテンプレートファイルを編集する際に、わざわざWebアプリケーションを起動しなくても、テンプレートファイルを直接ブラウザで開いて画面の見栄えを確認することができます。

11.4 簡単なサンプルを動かす

必要な作業は以下の5つです。

  1. pom.xmlの設定
  2. Controllerクラスの作成
  3. Viewの作成
  4. Spring Bootで実行
  5. ブラウザで確認
11.4.1 pom.xmlの設定

まずはSpring MVCやThymeleafを使用するためのライブラリを取得する必要があります。ライブラリは、Spring Bootが提供するStartersを使用して取得できます。

Startersのアーティファクトの1つである「Spring-boot-starter-web」を指定すると、Spring MVCを使用するためのさまざまなライブラリが取得できます。

11.4.2 Controllerクラスの作成

ソース11.3に簡単なControllerクラスを示します。

▼ソース11.3 Controllerクラス

@Controller
public class SampleController {
    @GetMapping("/display-sample")
    public String displaySample(Model model) {
        model.addAttribute("fullName", "埼玉次郎");
        return "sample";
    }
}

任意の名前でクラスを作成した後、クラスに@Controllerを付けます。@Controllerは、ステレオタイプアノテーションの1つです。コンポーネントスキャンされてBeanとして管理されます。

リクエストに対応する処理はメソッドで記述します。

なお、Modelという言葉は、MVCパターンの説明でも出てきましたが、Springが提供するModelと、MVCパターンのModelは別物と考えたほうがよいです、Springが提供するModelは、Viewに渡すデータの箱のようなイメージです。

11.4.3 Viewの作成

テンプレートファイルの格納場所や、テンプレートファイルの拡張子は、Spring Bootのオートコンフィグレーションによって設定されています。

ファイルを作成したら中身を記述していきます。テンプレートファイルのサンプルをソース11.4に示します。

▼ソース11.4 テンプレートファイルの記述例

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>サンプル</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <h1 th:text="${fullName}">東京太郎</h1></body>
</html>

Thymeleafの構文を使っている箇所は、❶の行です。th:textという属性に、「${fullName}」という値を設定しています。これは、Modelオブジェクトの中から、属性名「fullName」のデータを取得し、タグの中身(「東京太郎」が記述されている部分)を書き換えるという構文です。

11.4.4 Spring Bootで実行
11.4.5 ブラウザで確認

11.5 全体の処理の流れ

Spring MVCの裏側のプログラムで中心となるのが、DispatcherServletクラスです。DispatcherServletクラスは、Java標準のServletの仕組みで動いています。ブラウザからのリクエストは、いったんすべてDispatcherServletオブジェクトが受け付けます。DispatcherServletオブジェクトは、リクエストに対応するControllerオブジェクトを特定するため、HandlerMappingと呼ばれる役割のオブジェクトに特定を依頼します。

11.6 Serviceオブジェクトのインジェクション

▼ソース11.7 Serviceオブジェクトのインジェクション

@Controller
public class TrainingController {
    private final TrainingService trainingService; ❶

    public TrainingController(TrainingService trainingService) { ❷
        this.trainingService = trainingService;
    }
    …