前回は、Webアプリケーションの基本的な構造である「MVCパターン」について学びました。
MVCパターンは、Model(データ管理)、View(画面表示)、Controller(制御)の3つの要素で構成されており、それぞれの役割を明確に分けることで、保守性の高いアプリケーションを作ることができます。
今回は、その中でもコントローラーの役割を担うSpring BootのControllerについて詳しく学んでいきます。Controllerを理解することで、リクエストを受け取り、適切な処理を行い、レスポンスを返す流れを実装できるようになります。
今回の学習の重点をオレンジの枠線で図示します。

1. Controllerとは?
1.1 Spring BootのController
Spring BootのControllerとは、ユーザからのリクエストを受け取り、必要に応じてビジネスロジック(Model)を呼び出し、結果をView(Thymeleafなど)に返すクラスのことです。
Spring Bootでは@Controller
アノテーションを付けたクラスがその役割を担います。
上図のようにブラウザからアプリケーション(Spring Boot)がリクエストを受けると、該当のControllerメソッドが呼ばれ、必要に応じてModelを操作してデータを取得・加工します。
そして、そのデータをThymeleafテンプレートに渡してHTMLを生成し、ブラウザへ返します。
1.2 ControllerでHello World
まずは、Spring Bootでの「Hello World」をやってみましょう。
以下のようなControllerクラス(例:Hello1Controller.java
)を作成します。
あらかじめSpring Bootプロジェクトを作成しておいてください(前章参照)。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class Hello1Controller {
@GetMapping("/hello1")
public String helloWorld() {
System.out.println("Hello World");
return "blank";
// blank.html(Thymeleafファイル)は作成していません
}
}
@Controller
アノテーションによって、このクラスはHTTPリクエストを処理するControllerであるとSpringに認識されます。@GetMapping("/hello1")
は、http://localhost:8080/hello1
にGETリクエストが来たときに呼び出されるメソッドです。System.out.println("Hello World");
はログをコンソールに出力しています。ブラウザには表示されません。
実行してブラウザで/hello1
にアクセスすると、Thymeleafテンプレートblank.html
が返ってくる想定です(今回は作成していません)。
Eclipseでは、コンソールビューがあり、System.out.printlnなどのログはそちらに表示されます。プリントデバッグや各種エラー出力を行う場所として頻繁に目にすることになります。
このときのアドレスバーの表示が「http://localhost:8080/hello1」となっていて、「http://localhost:8080/blank.html」ではないことに注目して下さい。「templates」フォルダのファイル名は表示されないのです。
1.3 @GetMapping()
とは?
Spring Bootでは@GetMapping("/hello1")
を使います。これは「このControllerメソッドは /hello1
というURLパスで呼び出せます」という意味です。パスとメソッドを対応させることからマッピングということもあります。
Spring BootアプリケーションのURLは http://ドメイン名:ポート番号/パス
となります。
複数のControllerが同じURLパスを持っていると競合してしまい、正常に動作しない可能性があります。同じURLパスは一意にしておくのが基本ルールです。
2. Controllerクラスでデータを受け取る
@Controller
アノテーション付きクラスと、メソッドに@GetMapping
や@PostMapping
を付けることでHTTPのGET/POSTを受け取ることができます。
2.1 @GetMappingメソッド
GETリクエストを処理したい場合は、@GetMapping
を付けたメソッドを用意します。
@GetMapping("/hello2")
public String hello2() {
// GETリクエストを受け取った際の処理
return "viewname";
}
もしPOSTリクエストを処理したい場合は、@PostMapping
を付けたメソッドを用意します。(5章で解説)
2.2 Modelクラスとは?
Spring Boot(Thymeleaf)でコントローラからViewへデータを渡すには、Modelという仕組みを使います。Model は Controller から View にデータを渡すためのオブジェクトであり、キーとバリューのペアでデータを保持します。

注)以下はimport文を使わずにModelクラスを引数にしています。
@GetMapping("/hello2")
public String hello2(org.springframework.ui.Model model) {
model.addAttribute("message", "Hello World");
return "result"; // result.htmlへ渡す
}
model.addAttribute("message", "Hello World");
で「message」という名前で"Hello World"
をテンプレートに渡す。return "result";
で指定したテンプレート(result.html
)からmessage
を参照できます。

スコープ(有効範囲)
model.addAttribute()
でセットしたデータは、そのリクエストでViewを表示するタイミングまで有効です。レスポンスが返却された後は破棄されるため、「使い捨て」の領域です。この点が5章で学ぶセッションとの違いです。
3. Thymeleafにおける記述方法
属性の取り出し方
Thymeleafでは、以下のように${変数名}
を書くと、Modelに設定された属性を取り出すことができます。
<p th:text="${message}">ここにメッセージが入ります</p>
Controllerで model.addAttribute("message","Hello World")
とセットした値がHTMLの「ここにメッセージが入ります」と入れ替わり表示されます。

例:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Result</title>
</head>
<body>
<h1>結果表示</h1>
<p th:text="${message}">ここにメッセージが入ります</p>
</body>
</html>
Spring Bootでは「Controller」→「Thymeleafテンプレートに戻り値」としてデータを渡すのが基本のデータの流れです。
単体でHTMLを開いても、message
などは埋め込まれず、「ここにメッセージが入ります」と表示されます。(必ずControllerを経由して値をセットしてあげる必要があります。)
4. 常にControllerを経由してThymeleafにアクセスさせる
繰り返しになりますが、直接Thymeleafテンプレート(.html)にアクセスするのは推奨されません。その理由は以下の3点です。
- ビジネスロジックが露出してしまう
- コントローラーを通さず直接テンプレートにアクセスされると、意図しないデータを表示・操作される可能性があります。
- URL設計の問題
- どのControllerから遷移したのか分からないため、パラメータの受け渡しや制御が難しくなります。
- セキュリティの問題
- 認証・認可をバイパスして直接ページにアクセスされる恐れがあります。
必ずControllerを経由し、Controller側でModelに値を設定し、正しいView名を返すようにしてください。
第3章の今回はControllerからThymeleafにデータを渡してWebに表示する流れについて学びました。
第4章は「フォームからデータを送る 〜 リクエストとレスポンスの仕組み」です。
コントローラーでデータを受け取ることができたら、次はHTML(Thymeleaf)を使いデータをコントローラーに送る部分を学びます。
