@RequestMappingとは?ルーティングの仕組みを完全ガイド!初心者でもわかるSpring MVCの使い方
新人
「Spring MVCの@RequestMappingって何に使うんですか?難しそうでよく分かりません…」
先輩
「@RequestMappingは、ユーザーがブラウザで特定のURLにアクセスしたときに、そのリクエストをどのメソッドで処理するかを決めるためのものだよ。これがルーティングの基本なんだ。」
新人
「ルーティングってなんですか?それがないとどうなるんですか?」
先輩
「ルーティングがないと、ユーザーからのリクエストがどこに届くのか分からなくなるんだ。@RequestMappingを使うことで、例えば『/home』にアクセスしたらhomeメソッドが呼ばれる、というように関連づけることができるんだよ。」
新人
「なるほど!でも実際にどのように使うんですか?」
先輩
「それじゃあ、@RequestMappingの基本的な使い方を一緒に見ていこう!」
1. @RequestMappingとは?
@RequestMappingは、Spring MVCでルーティングを設定するために使うアノテーションです。ユーザーがWebブラウザでURLにアクセスしたとき、そのリクエストをどのメソッドで処理するかを指定します。これにより、適切な処理を行って結果をユーザーに返すことができます。
例えば、ユーザーが「/home」にアクセスした際に、特定のメソッドが呼び出されてHTMLページを表示する場合、そのマッピングを@RequestMappingで指定します。これがないと、ユーザーのリクエストがどのメソッドに対応しているのか分からなくなり、アプリケーションが正しく動きません。
また、@RequestMappingは@GetMappingや@PostMappingなどの元になっているアノテーションでもありますが、今回は@RequestMappingに焦点を当てて説明します。
2. ルーティングの基本概念と役割
ルーティングとは、ユーザーからのリクエストURLを受け取り、それに対応する処理を実行する仕組みです。Webアプリケーションでは、ユーザーがブラウザでURLを入力したり、ボタンをクリックしたときに、サーバーがリクエストを受け取り、適切な処理を行ってレスポンスを返します。この一連の流れが「ルーティング」です。
Spring MVCにおいて、ルーティングは@RequestMappingを使用して設定します。これにより、「どのURLにアクセスしたときにどのメソッドを呼び出すのか」を明確に指定できます。例えば、/homeにアクセスしたときはhome()メソッドを実行し、/aboutにアクセスしたときはabout()メソッドを実行する、といった指定が可能です。
以下に、基本的な@RequestMappingのコード例を示します。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HomeController {
@RequestMapping("/home")
public String home() {
return "home";
}
@RequestMapping("/about")
public String about() {
return "about";
}
}
上記のコードでは、@Controllerをクラスに付けて、Springに「これはコントローラだよ」と知らせています。@RequestMapping("/home")は、ブラウザで「/home」にアクセスしたときにhome()メソッドを実行することを示しています。同様に、@RequestMapping("/about")は「/about」へのアクセスでabout()メソッドが呼び出されます。
次に、対応するビュー(HTMLファイル)のコード例を見てみましょう。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ホームページ</title>
</head>
<body>
<h1>ホームページへようこそ!</h1>
<p>このページは@RequestMappingを使って表示しています。</p>
</body>
</html>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>アバウトページ</title>
</head>
<body>
<h1>このサイトについて</h1>
<p>ここではサイトの概要を紹介しています。</p>
</body>
</html>
【実行結果のイメージ】
ホームページへようこそ!
このページは@RequestMappingを使って表示しています。
このサイトについて
ここではサイトの概要を紹介しています。
実際にブラウザでlocalhost:8080/homeにアクセスすると「ホームページへようこそ!」と表示され、localhost:8080/aboutにアクセスすると「このサイトについて」が表示されます。このように@RequestMappingを使うことで、リクエストと処理メソッドを簡単に結びつけることができます。
開発環境のポイント:
- プロジェクトはpleiadesで作成し、依存関係はSpring Webを選択して追加してください。
- ビルドツールはGradleを使用します。
- HTMLファイルはsrc/main/resources/templatesフォルダに配置します。
3. @RequestMappingの基本的な使い方(簡単なコード例付き)
@RequestMappingは、Spring MVCでリクエストURLと処理メソッドを関連付けるための基本的なアノテーションです。このセクションでは、初心者でも理解しやすいように、簡単なコード例を用いて基本的な使い方を解説します。
例えば、ブラウザで「/hello」というURLにアクセスしたときに、挨拶のメッセージを表示するページを作成してみましょう。以下がGreetingControllerクラスのコード例です。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class GreetingController {
@RequestMapping("/hello")
public String hello() {
return "hello";
}
}
上記のコードでは、@Controllerをクラスに付けてSpringにコントローラであることを知らせています。@RequestMapping("/hello")は、ユーザーが「/hello」にアクセスしたときにhello()メソッドが実行されることを示しています。メソッド内では"hello"という文字列を返していますが、これはresources/templates/hello.htmlというビュー(HTMLファイル)を指しています。
次に、ビューであるhello.htmlファイルの内容を示します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>挨拶ページ</title>
</head>
<body>
<h1>こんにちは、Spring MVC!</h1>
<p>@RequestMappingを使った基本的な例です。</p>
</body>
</html>
【実行結果のイメージ】
こんにちは、Spring MVC!
@RequestMappingを使った基本的な例です。
実行後、ブラウザでlocalhost:8080/helloにアクセスすると、上記のように挨拶メッセージが表示されます。このように、@RequestMappingを使うことでURLと処理を簡単に結びつけることができます。
4. メソッドごとのリクエスト処理(GET、POSTなど)
@RequestMappingでは、リクエストメソッド(GET、POSTなど)を指定して処理を分けることができます。ユーザーがWebページを開いたりデータを送信したときに、それぞれ異なる処理を実行できるのです。
例えば、フォームに入力されたデータを送信する場合、GETメソッドとPOSTメソッドで異なる処理が求められます。以下に、GETリクエストとPOSTリクエストを処理するコード例を示します。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class FormController {
@RequestMapping(value = "/form", method = RequestMethod.GET)
public String showForm() {
return "form";
}
@RequestMapping(value = "/form", method = RequestMethod.POST)
public String submitForm(String name, Model model) {
model.addAttribute("name", name);
return "result";
}
}
- @RequestMapping(value = "/form", method = RequestMethod.GET) は、フォーム画面を表示するためのGETリクエストを処理します。
- @RequestMapping(value = "/form", method = RequestMethod.POST) は、フォーム送信後のデータ処理を担当します。
次に、フォームのHTMLファイル(form.html)の内容です。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>フォーム入力</title>
</head>
<body>
<h1>名前を入力してください</h1>
<form action="/form" method="post">
<input type="text" name="name" placeholder="お名前を入力">
<button type="submit">送信</button>
</form>
</body>
</html>
送信後に表示される結果画面(result.html)は以下の通りです。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>送信結果</title>
</head>
<body>
<h1>送信結果</h1>
<p th:text="'こんにちは、' + ${name} + 'さん!'">こんにちは、ゲストさん!</p>
</body>
</html>
【実行結果のイメージ】
送信結果
こんにちは、太郎さん!
この例では、ユーザーが名前を入力して送信すると、POSTメソッドが呼び出され、入力された名前が結果画面に表示されます。このようにGETとPOSTを使い分けることで、データ表示と処理を適切に管理できます。
5. パス変数とクエリパラメータの扱い方
@RequestMappingを使うと、URL内の値を取得する「パス変数」と、URLの後に続くパラメータを取得する「クエリパラメータ」を扱えます。それぞれの使い方を理解することで、より動的なWebアプリケーションを作成できます。
パス変数の使用例
パス変数は、URLの一部を変数として取得する方法です。以下のコードは、ユーザーIDをURLから取得し、表示する例です。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UserController {
@RequestMapping("/user/{id}")
public String getUser(@PathVariable("id") int id, Model model) {
model.addAttribute("userId", id);
return "user";
}
}
対応するビュー(user.html)は次の通りです。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ユーザー情報</title>
</head>
<body>
<h1>ユーザー情報</h1>
<p th:text="'ユーザーID: ' + ${userId}">ユーザーID: 未取得</p>
</body>
</html>
【実行結果のイメージ】
ユーザー情報
ユーザーID: 42
ブラウザでlocalhost:8080/user/42にアクセスすると、「ユーザーID: 42」と表示されます。@PathVariableを使うことで、URLの値を簡単に取得できます。
クエリパラメータの使用例
クエリパラメータは、URLの末尾に?key=valueの形式でデータを渡す方法です。以下の例では、ユーザー名をクエリパラメータで受け取ります。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class QueryController {
@RequestMapping("/search")
public String search(@RequestParam("query") String query, Model model) {
model.addAttribute("query", query);
return "search";
}
}
次に、対応するHTMLファイル(search.html)を作成します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>検索結果</title>
</head>
<body>
<h1>検索結果</h1>
<p th:text="'検索キーワード: ' + ${query}">検索キーワード: なし</p>
</body>
</html>
【実行結果のイメージ】
検索結果
検索キーワード: Spring MVC
ブラウザでlocalhost:8080/search?query=Spring%20MVCにアクセスすると、「検索キーワード: Spring MVC」と表示されます。@RequestParamを使うことで、ユーザーが入力した検索キーワードなどを簡単に取得できます。
6. @RequestMappingを使った簡単なWebアプリケーション作成例
ここでは、@RequestMappingを使って簡単なWebアプリケーションを作成してみましょう。今回は、商品情報を表示するアプリケーションを作成します。このアプリでは、商品一覧ページと商品詳細ページを用意します。
コントローラクラスの作成
まず、コントローラを作成し、商品一覧と商品詳細のルーティングを設定します。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ProductController {
@RequestMapping("/products")
public String productList(Model model) {
model.addAttribute("products", new String[]{"ノートパソコン", "スマートフォン", "タブレット"});
return "products";
}
@RequestMapping("/products/{name}")
public String productDetail(@PathVariable("name") String name, Model model) {
model.addAttribute("productName", name);
return "product-detail";
}
}
- /productsにアクセスすると、商品一覧ページが表示されます。
- /products/{name}にアクセスすると、指定した商品の詳細ページが表示されます。
商品一覧ページ(products.html)の作成
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>商品一覧</title>
</head>
<body>
<h1>商品一覧</h1>
<ul>
<li th:each="product : ${products}">
<a th:href="@{'/products/' + ${product}}" th:text="${product}">商品名</a>
</li>
</ul>
</body>
</html>
商品詳細ページ(product-detail.html)の作成
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>商品詳細</title>
</head>
<body>
<h1>商品詳細</h1>
<p th:text="'商品名: ' + ${productName}">商品名: 未取得</p>
<a href="/products">商品一覧に戻る</a>
</body>
</html>
【実行結果のイメージ】
商品一覧
- ノートパソコン
- スマートフォン
- タブレット
商品詳細
商品名: ノートパソコン
ポイント:
- productListメソッドでは、商品名の配列をビューに渡しています。
- productDetailメソッドでは、URLに含まれる商品名をパス変数として取得しています。
- 実行環境はpleiadesで、プロジェクト作成時にSpring Webを選択し、依存関係を追加してください。
7. よくあるエラーとその解決方法
@RequestMappingを使っていると、初心者がよく遭遇するエラーがあります。このセクションでは、代表的なエラーとその解決方法を解説します。
① HTTP 404エラー(ページが見つからない)
原因: URLと@RequestMappingのパスが一致していない場合に発生します。
解決策: メソッドに指定したパスとブラウザでアクセスするURLが正しいか確認してください。
// 正しい例
@RequestMapping("/home")
public String home() {
return "home";
}
アクセスURLはlocalhost:8080/homeである必要があります。
② HTTP 500エラー(内部サーバーエラー)
原因: ビュー名が間違っている、またはテンプレートファイルが存在しない場合に発生します。
解決策: ビュー名とsrc/main/resources/templates内のHTMLファイル名が一致しているか確認してください。
// メソッドで指定したビュー名
return "home";
この場合、home.htmlがtemplatesフォルダ内に必要です。
③ パス変数が取得できない
原因: @PathVariableの引数名とURLの変数名が一致していない場合に発生します。
解決策: パス変数の名前を揃えるか、@PathVariable("name")のように指定してください。
// 正しい例
@RequestMapping("/user/{id}")
public String getUser(@PathVariable("id") int id) {
// idを使用した処理
return "user";
}
URLはlocalhost:8080/user/1でアクセスします。
④ クエリパラメータが取得できない
原因: @RequestParamの引数名が一致していない場合に発生します。
解決策: クエリパラメータ名を確認し、正しく指定してください。
@RequestMapping("/search")
public String search(@RequestParam("query") String query) {
return "search";
}
アクセスURLはlocalhost:8080/search?query=Springです。
8. @RequestMappingを学ぶ際のポイントと今後の学習ステップ
@RequestMappingを理解したら、次に学ぶべき内容は以下の通りです。
- @GetMappingと@PostMapping:
@RequestMappingの簡略版として使われるアノテーションです。GETやPOST処理をよりシンプルに記述できます。 - フォーム入力処理: ユーザーからの入力データを受け取り、バリデーションを行う方法を学びましょう。
- エラーハンドリング:
@ControllerAdviceを使ったグローバルエラーハンドリングを学ぶことで、アプリケーションの信頼性が向上します。 - サービス層の導入: ビジネスロジックを分離して、コードの再利用性と可読性を高めます。
学習を進める際は、必ずコードを実際に書いて実行してみてください。エラーが出た場合も、今回紹介した「よくあるエラーとその解決方法」を参考に、原因を特定して対処しましょう。
今後の学習でおすすめの順序
@GetMappingと@PostMappingの基本的な使い方- モデルとビューの連携方法
- フォーム送信とデータバインディング
- エラーハンドリングと例外処理
- データベースとの連携(Spring Data JPA)
最後に、今回の学習で得た知識をもとに、簡単なWebアプリケーションを作成してみることをおすすめします。実際に手を動かすことで、理解が深まり、エラー解決力も向上します。