📝

【Spring Boot】Spring WebでHello, world!

2024/09/01に公開

http://localhost:8080/helloworld にアクセスして「Hello, world!」を表示するだけの Web アプリケーションを作成します。

1. 動作環境

  • macOS : 14.6.1
  • JDK : Temurin 21.0.4
  • Gradle : 8.8
  • Spring Boot : 3.3.2

1.1. 依存ライブラリ

Spring Initializr の Dependencies で指定する依存ライブラリは以下の通りです。

  • Spring Web(Spring MVC を使用した Web アプリケーションの構築)
  • Thymeleaf(テンプレートエンジン)

2. Spring Web と MVC モデルについて

Spring Web を使用したアプリケーションを MVC モデルに当てはめると以下のような構成になるかと思います。

役割 備考
M(モデル) @Service や @Repository アノテーションを付与したクラス
V(ビュー) Thymeleaf テンプレート
C(コントローラー) @Controller アノテーションを付与したクラス

これらのモデル、ビュー、コントローラーを担うファイルを作成していきます。

3. 作成

今回作成するファイルは以下の通りです。

  • HelloWorldService.java(モデル)
  • HelloWorldController.java(コントローラー)
  • HelloWorldView.html(ビュー)

プロジェクトは GitHub で公開しています。
https://github.com/iwazou-dev/springwebhelloworld/tree/v1.0.0

3.1. モデルの作成

まず MVC の「モデル」部分を担う HelloWorldService クラスを作成します。クラスには @Service アノテーションを付与します。本来はデータベースにアクセスする @Repository クラスの呼び出しなどのビジネスロジックを記述しますが今回はとりあえず戻り値で "Hello, world!"を返す getMessage メソッドだけ作成します。

HelloWorldService.java
package org.iwazou.sample.springwebhelloworld;

import org.springframework.stereotype.Service;

@Service
public class HelloWorldService {

    public String getMessage() {

        /*
         *
         * 本来はデータベースアクセスなどのなんらかのビジネスロジック
         *
         */

        return "Hello, world!";
    }

}

3.2. コントローラーの作成

次に MVC の「コントローラー」部分を担う HelloWorldController クラスを作成します。クラスには @Controller アノテーションを付与します。そして HTTP リクエストの GET /helloworld にマッピングさせる doGetHelloWorld メソッドを作成します。メソッドには @GetMapping("/helloworld") アノテーションを付与し以下の処理を行います。

  • ビジネスロジックの呼び出し
    HelloWorldService クラスの getMessage メソッドを呼び出し戻り値を message に設定する。
  • ビューへ渡すデータの設定
    Model インターフェースの addAttribute を呼び出しビューで参照する変数 message を設定する。
  • ビューの指定
    戻り値でビューを指定する。ビューに指定するのは後述するテンプレートファイルの拡張子(.html)を除いた名前。
HelloWorldController.java
package org.iwazou.sample.springwebhelloworld;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloWorldController {

    private final HelloWorldService service;

    public HelloWorldController(HelloWorldService service) {
        this.service = service;
    }

    @GetMapping("/helloworld")
    public String doGetHelloWorld(Model model) {
        /*
         * ビジネスロジックの呼び出し
         */
        String message = service.getMessage();

        /*
         * ビューへ渡すデータの設定
         */
        model.addAttribute("message", message);

        /*
         * ビューの指定
         */
        return "HelloWorldView";
    }

}

3.3. ビューの作成

最後に MVC の「ビュー」部分を担う Thymeleaf のテンプレート HelloWorldView.html を作成します。作成場所は src/main/resources/templates 配下です。

HelloWorldView.html
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="UTF-8">
    <title>サンプル</title>
</head>

<body>
    <h1 th:text="${message}">仮のメッセージ</h1>
</body>

</html>

上記テンプレート内の以下の属性は Thymeleaf 用の属性です。

  • xmlns:th
  • th:text

xmlns:th」はおまじないです。以下は公式ドキュメントからの引用です。

…これは、テンプレート処理に対しては何の影響もないのですが、IDE が th:*属性の名前空間定義がないことについて文句を言ってくるのを防ぐためのおまじないです。

th:text」は指定した式の値にテキストを変換します。今回の場合は message 変数の値により<h1>タグが以下のように変換されます。

<h1>Hello, world!</h1>

4. 実行

以下のコマンドを実行して http://localhost:8080/helloworld にアクセスします。

./gradlew bootRun

アクセス結果は以下のようになります。

画面

Discussion