@RequestParamと@PathVariableの違いと使い方を完全ガイド!初心者でも理解できるSpring Bootルーティング
新人
「Spring BootでWebページを作ろうとしているんですが、@RequestParamと@PathVariableって何に使うんですか?」
先輩
「簡単に言うと、@RequestParamはURLのパラメータを取得するために使って、@PathVariableはURLの一部を変数として取得するために使うんだ。」
新人
「なるほど!でも、具体的にどうやって使うんですか?実際のコードが見たいです。」
先輩
「じゃあ、基本的な使い方を詳しく説明していくよ!」
1. @RequestParamとは?
@RequestParamは、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.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class QueryController {
@GetMapping("/search")
public String search(@RequestParam("keyword") String keyword, Model model) {
model.addAttribute("result", "検索ワード:" + keyword);
return "searchResult"; // resources/templates/searchResult.html を表示
}
}
コードの説明:
@GetMapping("/search"):ブラウザで/searchにアクセスしたときにこのメソッドが呼ばれます。@RequestParam("keyword"):URLのクエリパラメータからkeywordの値を取得します。model.addAttribute("result", "検索ワード:" + keyword);:HTMLにデータを渡します。
■ 実行例
以下のURLにアクセスした場合:
http://localhost:8080/search?keyword=Spring
画面に次のように表示されます。
検索ワード:Spring
■ ポイント
- フォームからのデータ送信に便利です。
- クエリパラメータを簡単に取得できます。
- パラメータ名を変更するときは、
@RequestParam("新しい名前")を設定します。
2. @PathVariableとは?
@PathVariableは、URLの一部を変数として取得するためのアノテーションです。RESTfulなURL設計に使われ、リソースを特定する際に便利です。例えば、記事のIDやユーザーのIDをURLで指定したいときに活用できます。
【使用例】
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@Controller
public class PathController {
@GetMapping("/user/{id}")
public String getUser(@PathVariable("id") int id, Model model) {
model.addAttribute("userInfo", "ユーザーID:" + id);
return "userProfile"; // resources/templates/userProfile.html を表示
}
}
コードの説明:
@GetMapping("/user/{id}"):URLに含まれる{id}の部分が変数として扱われます。@PathVariable("id"):URLからidの値を取得します。model.addAttribute("userInfo", "ユーザーID:" + id);:HTMLにデータを渡します。
■ 実行例
以下のURLにアクセスした場合:
http://localhost:8080/user/5
画面に次のように表示されます。
ユーザーID:5
■ ポイント
- URLパスの変数を取得できるため、リソース指定に便利です。
- ブログ記事のIDや商品コードの取得などに使用されます。
@RequestParamと違い、クエリパラメータは不要です。
3. @RequestParamの基本的な使い方とコード例
@RequestParamは、WebアプリケーションでユーザーがフォームやURLのクエリパラメータからデータを送信する際に、その値を取得するためのアノテーションです。ユーザーが入力した値を取得し、処理に活用できます。
例えば、検索機能やフィルター機能、ページネーションなどで利用されます。以下では、ユーザー名と年齢を受け取って画面に表示する簡単な例を紹介します。
■ コード例(ユーザー情報の取得)
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class UserInfoController {
@GetMapping("/userinfo")
public String getUserInfo(@RequestParam("name") String name,
@RequestParam(value = "age", required = false, defaultValue = "未入力") String age,
Model model) {
model.addAttribute("userName", name);
model.addAttribute("userAge", age);
return "userInfo"; // resources/templates/userInfo.html を表示
}
}
■ 実行例
以下のURLにアクセスします。
http://localhost:8080/userinfo?name=田中&age=30
画面表示:
名前:田中
年齢:30
ポイント:
@RequestParam("name")で、URLのnameパラメータを取得します。@RequestParam(value = "age", required = false, defaultValue = "未入力")は、ageが指定されていない場合に「未入力」を表示します。- フォームからも同様にデータを受け取れます。
4. @PathVariableの基本的な使い方とコード例
@PathVariableは、URLパスの一部を変数として取得できるアノテーションで、特にリソース識別に使用されます。例えば、ユーザーIDや記事IDをURLで指定して取得する場合に便利です。
■ コード例(ユーザー詳細ページ)
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@Controller
public class UserProfileController {
@GetMapping("/profile/{userId}")
public String getProfile(@PathVariable("userId") int userId, Model model) {
model.addAttribute("profileInfo", "ユーザーID:" + userId + " のプロフィール情報");
return "profile"; // resources/templates/profile.html を表示
}
}
■ 実行例
以下のURLにアクセスします。
http://localhost:8080/profile/42
画面表示:
ユーザーID:42 のプロフィール情報
ポイント:
@PathVariable("userId")でURLの一部を取得します。- URL構造がわかりやすく、RESTful APIの設計に適しています。
- ユーザー情報や記事情報など、特定リソースを扱う際に便利です。
5. 両者の違いと使い分けのポイント
@RequestParamと@PathVariableはどちらもパラメータ取得に使いますが、用途やURL設計の考え方が異なります。以下に主な違いと使い分けのポイントをまとめました。
■ 比較表
| 項目 | @RequestParam | @PathVariable |
|---|---|---|
| 取得方法 | URLのクエリパラメータから取得 | URLパスの一部から取得 |
| 主な用途 | 検索・フィルタリング・ページネーション | リソース識別(ユーザーID・記事ID) |
| URL例 | /search?keyword=Java | /user/10 |
| 特徴 | 複数のオプション指定に便利 | URLがシンプルでRESTful設計に最適 |
| 可読性 | やや低い | 高い |
■ 使い分けのポイント
- 検索機能:
@RequestParamが便利。複数条件指定が可能。 - リソース参照:
@PathVariableが適切。URLがわかりやすくなります。 - 組み合わせ使用:必要に応じて両方を同時に使うことも可能。
■ 両方を組み合わせたコード例
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class CombinedController {
@GetMapping("/product/{productId}")
public String getProductDetails(@PathVariable("productId") int productId,
@RequestParam(value = "review", required = false, defaultValue = "false") String review,
Model model) {
model.addAttribute("productInfo", "商品ID:" + productId);
model.addAttribute("reviewFlag", "レビュー表示:" + ("true".equals(review) ? "あり" : "なし"));
return "productDetail"; // resources/templates/productDetail.html を表示
}
}
■ 実行例
以下のURLにアクセスします。
http://localhost:8080/product/100?review=true
画面表示:
商品ID:100
レビュー表示:あり
ポイント:
- リソース特定に
@PathVariable、オプション指定に@RequestParamを使用。 - 柔軟で拡張性のあるルーティング設計が可能。
6. 実践!簡単なWebアプリケーションを作って違いを体感
ここでは、@RequestParamと@PathVariableの違いを実際に体験できる簡単なWebアプリケーションを作成します。このアプリでは、商品情報を表示し、クエリパラメータでオプション情報を受け取る機能を実装します。
■ プロジェクト作成手順(Pleiades使用)
- Pleiadesを起動し、「新規プロジェクト作成」を選択します。
- 「Spring Starter Project」を選択し、以下を設定します。
- プロジェクト名:
ProductApp - パッケージ名:
com.example.productapp
- プロジェクト名:
- 依存関係の選択で以下にチェックを入れます。
- Spring Web(Webアプリ開発用)
- Thymeleaf(テンプレートエンジン)
- 「完了」をクリックしてプロジェクトを作成します。
■ コントローラーコード(ProductController.java)
package com.example.productapp.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class ProductController {
@GetMapping("/product/{id}")
public String getProduct(@PathVariable("id") int id,
@RequestParam(value = "showDetails", required = false, defaultValue = "false") String showDetails,
Model model) {
model.addAttribute("productId", id);
model.addAttribute("details", "true".equals(showDetails) ? "商品の詳細情報が表示されます。" : "詳細は非表示です。");
return "product";
}
}
■ HTMLコード(product.html)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>商品情報</title>
</head>
<body>
<h1>商品情報</h1>
<p>商品ID:<span th:text="${productId}"></span></p>
<p><span th:text="${details}"></span></p>
<a href="/product/101?showDetails=true">詳細を表示</a> |
<a href="/product/101?showDetails=false">詳細を非表示</a>
</body>
</html>
■ 実行手順
ProductAppApplication.javaを右クリックし、「Spring Boot アプリケーションの実行」を選択します。- ブラウザで以下にアクセスします。
http://localhost:8080/product/101http://localhost:8080/product/101?showDetails=true
■ 実行結果
URL: http://localhost:8080/product/101
商品ID:101
詳細は非表示です。
URL: http://localhost:8080/product/101?showDetails=true
商品ID:101
商品の詳細情報が表示されます。
■ ポイント
@PathVariableで商品IDをURLパスから取得します。@RequestParamで詳細表示の有無をクエリパラメータから取得します。- 両方を組み合わせることで柔軟なURL設計が可能です。
7. よくあるエラーとその解決方法
@RequestParamや@PathVariableを使う際、初心者がつまずきやすいエラーとその解決方法を解説します。
■ エラー1:MissingServletRequestParameterException
原因: 必須の@RequestParamがURLに指定されていない。
@GetMapping("/search")
public String search(@RequestParam("keyword") String keyword) {
return "result";
}
アクセス例(エラーになるURL): http://localhost:8080/search
■ 解決方法
required = falseを指定する。defaultValueを設定してデフォルト値を用意する。
@GetMapping("/search")
public String search(@RequestParam(value = "keyword", required = false, defaultValue = "未指定") String keyword) {
return "result";
}
■ エラー2:IllegalArgumentException: Missing path variable
原因: URLに@PathVariableが指定されていない。
@GetMapping("/user/{id}")
public String getUser(@PathVariable("id") int id) {
return "user";
}
アクセス例(エラーになるURL): http://localhost:8080/user/
■ 解決方法
- URLパスに変数を必ず含める。
- デフォルトURLを用意し、ユーザーが直接アクセスしてもエラーにならないようにする。
@GetMapping("/user/{id}")
public String getUser(@PathVariable("id") int id) {
return "user";
}
@GetMapping("/user")
public String userDefault() {
return "redirect:/user/1";
}
■ エラー3:型変換エラー(TypeMismatchException)
原因: 期待される型とURLパラメータの型が一致しない。
@GetMapping("/product/{id}")
public String getProduct(@PathVariable("id") int id) {
return "product";
}
アクセス例(エラーになるURL): http://localhost:8080/product/abc
■ 解決方法
- URLのパラメータ型を正しく指定する。
- 型変換が必要な場合は事前にバリデーションを実施する。
8. 次の学習ステップとおすすめの勉強方法
@RequestParamと@PathVariableの基本を理解したら、次のステップとして以下の内容に進むことをおすすめします。
■ 学習ステップ
- フォーム処理の詳細: フォームバリデーションやエラーメッセージの表示方法。
- Thymeleafの活用: 条件分岐やループを使った動的ページの作成。
- Spring Data JPAとの連携: データベースと連携し、データの保存や取得を学ぶ。
- エラーハンドリング:
@ControllerAdviceを使った例外処理。 - セキュリティ対策: Spring Securityを用いた認証・認可の基本。
■ おすすめの勉強方法
- 小さなアプリを自作して、実際に手を動かして学ぶ。
- 公式ドキュメントを読むことで最新情報をキャッチアップ。
- 学習記録としてブログを書くと理解が深まります。
- 疑問があれば、Stack OverflowやGitHubで質問・調査。
まとめ
本記事では、Spring BootのWebアプリケーション開発におけるルーティング処理に欠かせないアノテーションである@RequestParamと@PathVariableの違いと使い方を徹底的に解説しました。@RequestParamはURLに含まれるクエリパラメータから値を取得し、検索条件やオプション情報の受け取りに便利です。一方で、@PathVariableはURLパスの一部から値を取得し、リソースの識別やID指定などに適したアノテーションです。
それぞれのアノテーションは使用目的に応じて選択する必要があり、例えば検索機能やフィルター処理には@RequestParam、ユーザーIDや商品IDといった個別リソースを指定する場合には@PathVariableが効果的です。また、これらを組み合わせることで、RESTfulで可読性の高いURL設計が可能となり、柔軟で拡張性のあるWebアプリケーション開発を実現できます。
さらに、よくあるエラーとその解決方法を紹介することで、初心者でもつまずかずに実装できるよう配慮しました。実際のプロジェクトでありがちなMissingServletRequestParameterExceptionやTypeMismatchExceptionなどに対する具体的な対処方法を提示し、開発現場で役立つ知識として落とし込んでいます。
本記事を通じて、Spring Bootでのルーティング設計における基本的な考え方、設計パターン、そしてそれぞれのアノテーションの役割を明確に理解できたはずです。特に、リソース志向の開発においては@PathVariableを活用することで、URL構造がシンプルで直感的になり、保守性も向上します。一方で、柔軟にユーザー指定の情報を受け取る場面では@RequestParamの使いこなしが求められます。
今後、Spring Bootのより高度な機能であるバリデーション、データベース連携、認証・認可機構などを学んでいく際にも、この基礎知識は不可欠です。しっかりと身につけておくことで、よりスムーズに応用へとステップアップできるでしょう。
最後に、これらのアノテーションを使った実装を日々の学習や小規模なWebアプリケーションで実践することで、理解がより深まり定着していきます。以下はその学びの実践例のひとつです。
■ 練習コード例:@PathVariableと@RequestParamを組み合わせた実装
package com.example.practice.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class SampleController {
@GetMapping("/order/{orderId}")
public String getOrderDetail(@PathVariable("orderId") int orderId,
@RequestParam(value = "showStatus", required = false, defaultValue = "false") String showStatus,
Model model) {
model.addAttribute("orderId", orderId);
model.addAttribute("status", "true".equals(showStatus) ? "注文ステータス:配送中" : "ステータス非表示");
return "orderDetail"; // resources/templates/orderDetail.html を表示
}
}
生徒
今日は@RequestParamと@PathVariableの違いや使い方を、実例付きで理解できました!
先生
いいね!それぞれの特徴をしっかり把握できたかな?使い分けができるとURL設計がきれいになるよ。
生徒
はい!@RequestParamは検索条件やオプションに使って、@PathVariableはIDとかリソース指定に使うと便利なんですね。
先生
その通り!URLの可読性やメンテナンス性にも関わってくるから、今のうちにしっかり身につけておこう。
生徒
はい、実際にコードを書いて何度も試してみます!ありがとうございました!