【Spring Boot】Spring WebでHello, world!
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 で公開しています。
3.1. モデルの作成
まず MVC の「モデル」部分を担う HelloWorldService
クラスを作成します。クラスには @Service
アノテーションを付与します。本来はデータベースにアクセスする @Repository
クラスの呼び出しなどのビジネスロジックを記述しますが今回はとりあえず戻り値で "Hello, world!"を返す getMessage
メソッドだけ作成します。
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)を除いた名前。
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
配下です。
<!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