Spring Bootのコントローラ設定ガイド!初心者でもわかる基本的な @controller アノテーションの使い方
生徒
「Spring Bootでコントローラを作りたいんですが、どこに配置するんですか?」
先生
「コントローラは通常、controllerというフォルダを作り、その中に配置します。また、@GetMappingを使うと簡単にルーティングできますよ。」
生徒
「画面遷移もできるんですか?」
先生
「はい、パラメータを使わない遷移も簡単に設定できます。それでは、具体的に解説していきましょう。」
1. コントローラとは?
JavaのSpring Bootフレームワークにおいて、コントローラはユーザーのリクエストを処理し、対応するレスポンスを返す役割を持っています。ウェブアプリケーションでは、ブラウザからのアクセスを受け取り、リクエストに対応するメソッドを実行して適切なHTMLやJSONのデータを返す仕組みです。
2. コントローラの配置場所
Spring Bootプロジェクトでコントローラを作成する際は、通常controllerパッケージを新規作成し、その中にファイルを配置します。例えば、以下のようなフォルダ構成にすることで、後のメンテナンスがしやすくなります。
└─ src
└─ main
└─ java
└─ com
└─ example
└─ demo
└─ controller
└─ SampleController.java
このようにしておくと、他のファイルと混ざらずに整理ができます。また、パッケージ名はcontrollerとすると管理が簡単になります。
3. @GetMappingアノテーション
@GetMappingは、特定のURLパスへのGETリクエストに対してメソッドを紐付けるアノテーションです。ブラウザからのアクセスに対し、HTMLファイルや文字列などを返す際に利用します。以下のコード例を見てみましょう。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class SampleController {
@GetMapping("/home")
public String showHomePage() {
return "home";
}
}
この例では、ブラウザがhttp://localhost:8080/homeにアクセスするとhomeという名前のHTMLが表示されます。showHomePageメソッドが"/home"にアクセスした際に実行されるため、わかりやすい画面遷移が可能です。
4. パラメータなしの画面遷移
Spring Bootでは、画面遷移のためにURLのパラメータを使用せずに遷移を設定できます。これは、固定URLのエンドポイントを設定するだけで実現可能です。
例えば、先ほどのコードでは、@GetMapping("/home")を指定しているので、/homeにアクセスするとhome.htmlが表示されます。以下のようなURLの設定もできます。
@GetMapping("/about")
public String showAboutPage() {
return "about";
}
このように設定すると、/aboutにアクセスした際にabout.htmlが表示されます。URLごとに異なるHTMLを返すことで、複数のページ遷移が可能です。
5. HTMLファイルの配置場所
Spring BootでHTMLファイルは、通常、以下のフォルダに配置します。
└─ src
└─ main
└─ resources
└─ templates
└─ home.html
└─ about.html
ここに配置することで、自動的にテンプレートエンジンThymeleafによってHTMLが読み込まれるようになります。showHomePageメソッドでreturn "home";とした場合、templates/home.htmlが読み込まれる仕組みです。
6. コントローラの動作確認
コントローラが正常に動作するかを確認するには、アプリケーションを起動し、http://localhost:8080/homeなどのURLにアクセスします。正しく配置されている場合、指定したhome.htmlの内容が表示されます。
7. @Controller と @RestController の違い
@Controllerはテンプレート(例:Thymeleaf)にレンダリングさせるためのビュー名を返すのが基本です。一方、@RestControllerは@Controller + @ResponseBodyの組み合わせで、メソッドの戻り値をそのままHTTPレスポンス本文にします。画面(HTML)を返す通常のWebアプリでは@Controllerを使い、APIのようにJSONや文字列を返したい場合は@ResponseBodyを付ける、という使い分けを覚えましょう。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
// 画面(テンプレート)を返す:ビュー名を返却
@GetMapping("/hello")
public String helloView() {
return "hello"; // templates/hello.html を描画
}
// 本文を直接返す:@ResponseBody を付与
@GetMapping("/api/ping")
@ResponseBody
public String ping() {
return "pong";
}
}
8. Modelで値をテンプレートへ渡す(ビュー名の返し方の基本)
@Controllerでは、Modelに属性を詰めてビュー(テンプレート)へ渡します。メソッドはテンプレート名(拡張子なし)を返すだけでOKです。テンプレート側では、Thymeleafの式で受け取った値を表示します。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class GreetController {
@GetMapping("/greet")
public String greet(Model model) {
model.addAttribute("userName", "太郎");
model.addAttribute("today", "2025-08-25");
return "greet"; // templates/greet.html
}
}
<!-- templates/greet.html(抜粋) -->
<h1 th:text="'ようこそ、' + ${userName} + 'さん!'"></h1>
<p th:text="'本日の日付:' + ${today}"></p>
戻り値で指定した名前に対応するHTMLが src/main/resources/templates から自動解決されます。これが「ビュー名を返す」という@Controllerの基本パターンです。
9. @PostMappingでフォーム送信を受け取り、リダイレクトする
フォーム送信は@PostMappingで受け取り、処理完了後はPRGパターン(Post/Redirect/Get)でリロードによる重複送信を防ぐのが定番です。リダイレクトは戻り値にredirect:を付けるだけで指定できます。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
@Controller
public class ContactController {
@PostMapping("/contact")
public String submitContact(
@RequestParam String name,
@RequestParam String message,
RedirectAttributes ra) {
// ここで保存やメール送信などの処理を行う
ra.addFlashAttribute("notice", "お問い合わせを受け付けました。ありがとうございます。");
// 完了画面へリダイレクト(/contact/complete に GET)
return "redirect:/contact/complete";
}
@GetMapping("/contact/complete")
public String complete() {
return "contact-complete"; // templates/contact-complete.html
}
}
フラッシュスコープ(RedirectAttributes)を使うと、リダイレクト後の画面でメッセージを1回だけ表示できます。これも@Controllerでの画面遷移の基本テクニックです。
まとめ
この記事では、Spring Bootにおけるコントローラの基本的な設定と使用方法について詳しく解説しました。コントローラは、ユーザーからのリクエストを処理し、対応するレスポンスを返す重要な役割を果たします。@GetMappingアノテーションを利用することで、URLとメソッドを簡単に紐付けられるため、複数の画面遷移や機能を実現できます。
また、コントローラの配置場所やHTMLファイルの保存先についても説明しました。「controller」パッケージとsrc/main/resources/templatesディレクトリを活用することで、プロジェクトの管理が容易になり、他の開発者との共同作業もスムーズに行えます。
以下に、基本的なコントローラのサンプルコードを再掲します。このコードでは、homeページとaboutページへの画面遷移を実装しています。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class PageController {
@GetMapping("/home")
public String showHomePage() {
return "home";
}
@GetMapping("/about")
public String showAboutPage() {
return "about";
}
}
このコードに対応するHTMLファイルをsrc/main/resources/templatesに保存することで、ブラウザからのアクセスに応じて適切なページが表示されます。例えば、http://localhost:8080/homeにアクセスするとhome.htmlが読み込まれます。
Spring Bootでは、簡単な設定でコントローラの動作確認ができるため、初学者でも手軽にウェブアプリケーションを構築できます。特に、URLごとに異なる画面を返す機能は、複雑なアプリケーションを作成する上での基盤となります。
生徒
「Spring Bootのコントローラを使えば、URLごとに異なるページを簡単に表示できるんですね!」
先生
「そうです。@GetMappingを使えば、URLとメソッドを紐付ける作業がとても簡単になります。」
生徒
「フォルダ構成を整理することで、他の開発者とも共有しやすくなりそうですね。」
先生
「その通りです。プロジェクトが大きくなると、整理されたフォルダ構成がとても役に立ちます。」
生徒
「次はパラメータを使った動的な画面遷移も試してみたいと思います!」
先生
「それは良いですね。動的な画面遷移を実装することで、ユーザーの入力に応じた柔軟なアプリケーションを作成できますよ。」
この記事を読んだ人からの質問
プログラミング初心者からのよくある疑問/質問を解決します
Spring Bootでコントローラを作成する場合、どのフォルダに配置すればよいですか?
Spring Bootでは、通常「controller」という名前のパッケージを作成し、その中にコントローラのクラスを配置します。例えば、com.example.demo.controllerのようなパッケージ構成が一般的です。
@GetMappingアノテーションは何のために使いますか?
@GetMappingは、特定のURLへのGETリクエストを処理するメソッドを指定するためのアノテーションです。例えば、@GetMapping("/home")とすると、/homeにアクセスがあった際に対応するメソッドが実行されます。
HTMLファイルはどこに配置すればいいですか?
HTMLファイルは、src/main/resources/templatesディレクトリに配置します。このディレクトリに置かれたファイルは、Thymeleafテンプレートエンジンで自動的に読み込まれます。
Spring Bootのコントローラで画面遷移を設定する方法は?
画面遷移は、コントローラ内でURLとHTMLファイルを関連付けることで設定します。例えば、@GetMapping("/home")のメソッドでreturn "home";とすると、templates/home.htmlが表示されます。
Spring Bootで複数の画面を作るにはどうすれば良いですか?
複数の画面を作るには、それぞれ異なるURLを@GetMappingで設定し、対応するHTMLファイルをtemplatesディレクトリに保存します。例えば、/home用のhome.html、/about用のabout.htmlを作成します。
コントローラの動作確認はどのように行いますか?
Spring Bootアプリケーションを起動し、ブラウザで設定したURLにアクセスします。例えば、http://localhost:8080/homeにアクセスして、期待した画面が表示されるか確認します。
Spring Bootで使用するHTMLファイルに動的な要素を加えるにはどうすれば良いですか?
動的な要素を加えるには、Thymeleafを使ってHTMLファイル内に変数や条件文を記述します。コントローラでデータをモデルに追加し、それをHTMLファイルで参照する形で動的な内容を作成します。
Spring Bootのコントローラとサービスの違いは何ですか?
コントローラは、ユーザーからのリクエストを受け取り、レスポンスを返す役割を持ちます。一方で、サービスはビジネスロジックを実行する役割を持ち、コントローラから呼び出されてデータ処理を行います。
固定URL以外にパラメータ付きの画面遷移は可能ですか?
はい、可能です。Spring Bootでは、@RequestParamや@PathVariableを使用してパラメータを受け取り、それを使った画面遷移を実現できます。
Thymeleafを使用する場合、コントローラでどのようにデータを渡しますか?
Thymeleafを使用する際、コントローラのメソッドでModelオブジェクトを利用してデータを渡します。例えば、model.addAttribute("key", value);を使うことで、HTMLファイル内で変数として参照できます。
テンプレートを表示したいのに @RestController を付けたら文字列がそのまま出ます。どう直せばいい?
テンプレートを描画したい場合は @Controller を使い、メソッドからビュー名(例:"home")を返してください。@RestController は戻り値を本文に書き出すため、ビューは解決されません。
@Controller のまま JSON を返す方法はありますか?
あります。メソッドに @ResponseBody を付けるか、戻り値を ResponseEntity<T> にして返してください。クラスに @ResponseBody を付ける方法もあります。
理解度のクイズ問題
空欄の★に当てはまる内容を答えてください。
@Controller class SampleController { @GetMapping("/hello") public String helloView() { return "hello"; } @GetMapping("/api/ping") @ResponseBody public String ping() { return "pong"; } }
@RestControllerは@Controller+@ResponseBodyの合成。
・関連キーワード:Spring Boot コントローラ、テンプレートエンジン、APIレスポンス、SEO(入門/基本)。