Form入力の基本(リクエストパラメータの取得)完全ガイド!初心者でもわかるSpring MVCのフォーム処理
新人
「Spring MVCでフォームから入力されたデータを取得したいんですが、どうすればいいんですか?」
先輩
「フォーム入力のデータはリクエストパラメータとして送信されるから、それを受け取る方法を覚えると便利だよ。」
新人
「リクエストパラメータって何ですか?難しそうです…。」
先輩
「大丈夫!簡単に説明するから一緒に見ていこう!」
1. フォーム入力とは?
フォーム入力とは、ユーザーがWebページ上のフォームに情報を入力し、そのデータをサーバーに送信することを指します。例えば、名前やメールアドレス、メッセージなどを入力して送信する場面をよく見かけます。
Spring MVCでは、フォームから送信されたデータをリクエストパラメータとして受け取り、処理することが可能です。
以下は、ユーザーが名前を入力して送信できる簡単なHTMLフォームの例です。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>名前入力フォーム</title>
</head>
<body>
<h1>名前を入力してください</h1>
<form action="/submit" method="post">
<label for="name">名前:</label>
<input type="text" id="name" name="name" required>
<button type="submit">送信</button>
</form>
</body>
</html>
このフォームは、ユーザーが「名前」フィールドに入力し、送信ボタンを押すと、/submitというURLにデータをPOSTメソッドで送信します。
2. リクエストパラメータとは?
リクエストパラメータとは、クライアント(ブラウザなど)からサーバーに送信されるデータのことです。フォームの入力内容やURLに含まれるデータが該当します。
例えば、以下のURLの場合:
http://localhost:8080/submit?name=太郎
この?name=太郎部分がリクエストパラメータです。パラメータ名はnameで、値は太郎です。
2.1 コントローラでリクエストパラメータを取得する方法
Spring MVCでは、@RequestParamアノテーションを使うことで、リクエストパラメータを簡単に取得できます。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class FormController {
@PostMapping("/submit")
public String handleForm(@RequestParam("name") String name, Model model) {
model.addAttribute("message", name + "さん、こんにちは!");
return "result"; // result.htmlを表示
}
}
このコードのポイント:
@PostMapping("/submit"):/submitに対するPOSTリクエストを処理。@RequestParam("name"):フォームから送信されたnameパラメータを取得。model.addAttribute("message", ...):ビューに表示するメッセージを渡す。
2.2 結果表示用HTML(result.html)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>結果画面</title>
</head>
<body>
<h1 th:text="${message}">デフォルトメッセージ</h1>
</body>
</html>
太郎さん、こんにちは!
このように、フォームから送信されたデータをコントローラで取得し、ビューに渡して表示する流れが基本となります。
3. @RequestParamを使ったリクエストパラメータの取得方法
@RequestParamは、Spring MVCでリクエストパラメータを取得するための基本的なアノテーションです。フォームやURLから送信されたパラメータを簡単に取得し、メソッドの引数として扱うことができます。
3.1 基本的な使用例
以下は、@RequestParamを使用してユーザーの名前を取得し、挨拶メッセージを表示するコントローラの例です。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class GreetingController {
@PostMapping("/greet")
public String greetUser(@RequestParam("name") String name, Model model) {
model.addAttribute("message", name + "さん、ようこそ!");
return "greet-result"; // greet-result.htmlを表示
}
}
このコードでは、フォームから送信されたnameパラメータを取得し、model.addAttribute()でビューに渡しています。
3.2 結果表示用HTML(greet-result.html)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>挨拶結果</title>
</head>
<body>
<h1 th:text="${message}">デフォルトメッセージ</h1>
</body>
</html>
山田さん、ようこそ!
このように、@RequestParamを使うと簡単にパラメータを取得できます。
4. 複数パラメータの取得方法とその活用例
実際のWebアプリケーションでは、名前だけでなく、メールアドレスや年齢など複数の情報を取得したい場合があります。そのような場合も@RequestParamを複数指定することで簡単に実現できます。
4.1 複数パラメータの取得例
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class UserInfoController {
@PostMapping("/user-info")
public String getUserInfo(@RequestParam("name") String name,
@RequestParam("email") String email,
@RequestParam("age") int age,
Model model) {
model.addAttribute("info", name + "さん (" + age + "歳) のメールアドレスは " + email + " です。");
return "user-info-result"; // user-info-result.htmlを表示
}
}
このコードは、名前・メールアドレス・年齢の3つのパラメータを取得し、ユーザー情報を表示します。
4.2 入力用HTMLフォーム(user-info-form.html)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ユーザー情報入力</title>
</head>
<body>
<h1>ユーザー情報を入力してください</h1>
<form action="/user-info" method="post">
<label for="name">名前:</label>
<input type="text" id="name" name="name" required><br>
<label for="email">メールアドレス:</label>
<input type="email" id="email" name="email" required><br>
<label for="age">年齢:</label>
<input type="number" id="age" name="age" required><br>
<button type="submit">送信</button>
</form>
</body>
</html>
4.3 結果表示用HTML(user-info-result.html)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ユーザー情報結果</title>
</head>
<body>
<h1 th:text="${info}">デフォルト情報</h1>
</body>
</html>
山田太郎さん (30歳) のメールアドレスは taro@example.com です。
この例では、複数のパラメータを簡単に取得して、まとめて表示することができます。
5. フォームから送信されたデータをコントローラで受け取る流れ
最後に、フォーム入力からデータ取得までの全体の流れを整理しましょう。以下のステップでデータが処理されます。
- ユーザーがHTMLフォームにデータを入力。
- 送信ボタンを押すと、データが指定されたURLにリクエストとして送信される。
- Spring MVCのコントローラがリクエストを受け取り、
@RequestParamでパラメータを取得。 - 取得したデータを
Modelに追加し、ビューに渡す。 - ビューでデータを表示。
この流れを理解することで、Spring MVCでのフォーム入力処理がスムーズに実装できるようになります。
5.1 まとめの実践例
ユーザーが商品名と数量を入力し、合計金額を計算するフォームを実装してみましょう。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class OrderController {
@PostMapping("/order")
public String calculateTotal(@RequestParam("product") String product,
@RequestParam("price") int price,
@RequestParam("quantity") int quantity,
Model model) {
int total = price * quantity;
model.addAttribute("summary", product + "を" + quantity + "個購入。合計金額は " + total + "円です。");
return "order-result"; // order-result.htmlを表示
}
}
5.2 入力フォームHTML(order-form.html)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>商品注文フォーム</title>
</head>
<body>
<h1>商品注文</h1>
<form action="/order" method="post">
<label for="product">商品名:</label>
<input type="text" id="product" name="product" required><br>
<label for="price">価格 (円):</label>
<input type="number" id="price" name="price" required><br>
<label for="quantity">数量:</label>
<input type="number" id="quantity" name="quantity" required><br>
<button type="submit">注文</button>
</form>
</body>
</html>
5.3 結果表示HTML(order-result.html)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>注文結果</title>
</head>
<body>
<h1 th:text="${summary}">注文情報がここに表示されます</h1>
</body>
</html>
りんごを3個購入。合計金額は 900円です。
この例を通じて、実際の業務でも役立つ基本的なフォーム入力処理の流れが理解できたと思います。
6. @ModelAttributeを使ったオブジェクトへのバインディング方法
@ModelAttributeは、フォームから送信された複数のリクエストパラメータをオブジェクトに自動的にバインドするための便利なアノテーションです。これを使用することで、複数のフィールドを持つデータを効率よく処理できます。
6.1 モデルクラスの作成
まず、フォームの入力を受け取るためのモデルクラスを作成します。以下は、ユーザー情報を扱うUserクラスの例です。
package com.example.demo.model;
public class User {
private String name;
private String email;
private int age;
// ゲッターとセッター
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
6.2 コントローラでの使用例
@ModelAttributeを使うことで、フォームデータが自動的にUserオブジェクトにマッピングされます。
package com.example.demo.controller;
import com.example.demo.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class UserController {
@GetMapping("/register")
public String showForm(Model model) {
model.addAttribute("user", new User());
return "register-form";
}
@PostMapping("/register")
public String submitForm(@ModelAttribute("user") User user, Model model) {
model.addAttribute("message", user.getName() + "さんの登録が完了しました!");
return "register-result";
}
}
6.3 入力フォームHTML(register-form.html)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ユーザー登録フォーム</title>
</head>
<body>
<h1>ユーザー登録</h1>
<form action="/register" method="post">
<label for="name">名前:</label>
<input type="text" id="name" name="name" required><br>
<label for="email">メールアドレス:</label>
<input type="email" id="email" name="email" required><br>
<label for="age">年齢:</label>
<input type="number" id="age" name="age" required><br>
<button type="submit">登録</button>
</form>
</body>
</html>
6.4 結果表示HTML(register-result.html)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>登録結果</title>
</head>
<body>
<h1 th:text="${message}">登録メッセージが表示されます</h1>
</body>
</html>
田中さんの登録が完了しました!
@ModelAttributeを使うことで、複数のパラメータを個別に指定することなく、簡潔なコードでオブジェクトにデータを格納できます。
7. トラブルシューティング(よくあるエラーとその対処法)
フォーム入力処理でよく発生するエラーとその対処法をいくつか紹介します。
7.1 400 Bad Requestエラー
原因:フォームで送信されたパラメータが、コントローラのメソッド引数と一致していない場合に発生します。
対処法:フォームのname属性と、コントローラで受け取る引数の名前が一致しているか確認しましょう。
7.2 NullPointerExceptionエラー
原因:未入力のフィールドを処理する際に、nullが原因でエラーが発生することがあります。
対処法:@RequestParamにrequired=falseを指定するか、@ModelAttributeを使用してデフォルト値を設定してください。
7.3 データバインディングの失敗
原因:モデルクラスにゲッター・セッターがない場合、データがバインディングされません。
対処法:必ずゲッター・セッターを用意しましょう。
8. 実践!簡単なフォーム入力アプリケーションの作成と動作確認
最後に、これまで学んだ内容を活用して、商品の注文アプリケーションを作成してみましょう。
8.1 モデルクラスの作成(Order.java)
package com.example.demo.model;
public class Order {
private String product;
private int price;
private int quantity;
public String getProduct() { return product; }
public void setProduct(String product) { this.product = product; }
public int getPrice() { return price; }
public void setPrice(int price) { this.price = price; }
public int getQuantity() { return quantity; }
public void setQuantity(int quantity) { this.quantity = quantity; }
}
8.2 コントローラの作成(OrderController.java)
package com.example.demo.controller;
import com.example.demo.model.Order;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class OrderController {
@GetMapping("/order")
public String showOrderForm(Model model) {
model.addAttribute("order", new Order());
return "order-form";
}
@PostMapping("/order")
public String submitOrder(@ModelAttribute("order") Order order, Model model) {
int total = order.getPrice() * order.getQuantity();
model.addAttribute("summary", order.getProduct() + "を" + order.getQuantity() + "個購入。合計金額は " + total + "円です。");
return "order-result";
}
}
8.3 入力フォームHTML(order-form.html)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>商品注文フォーム</title>
</head>
<body>
<h1>商品注文</h1>
<form action="/order" method="post">
<label for="product">商品名:</label>
<input type="text" id="product" name="product" required><br>
<label for="price">価格 (円):</label>
<input type="number" id="price" name="price" required><br>
<label for="quantity">数量:</label>
<input type="number" id="quantity" name="quantity" required><br>
<button type="submit">注文</button>
</form>
</body>
</html>
8.4 結果表示HTML(order-result.html)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>注文結果</title>
</head>
<body>
<h1 th:text="${summary}">注文情報がここに表示されます</h1>
</body>
</html>
りんごを3個購入。合計金額は 900円です。
以上のコードを実行すると、フォームに商品名・価格・数量を入力して注文ボタンをクリックすることで、合計金額が表示されます。
これにより、実際のWebアプリケーションでよくあるフォーム処理を学ぶことができます。
まとめ
フォーム入力からリクエストパラメータを受け取り、コントローラで処理してビューに渡すという一連の流れを振り返ると、Spring MVCが提供している仕組みのわかりやすさと柔軟さが実感できるようになります。とくに、初心者が最初に戸惑いやすいのが「フォームの入力内容がどのようにサーバーへ渡り、どのようにJavaのコードで取得されるのか」という点ですが、実際には@RequestParamや@ModelAttributeなど、理解しやすいアノテーションが用意されているため、流れさえ覚えてしまえば驚くほどスムーズに扱えるようになります。
また、フォーム入力の情報がリクエストパラメータとして送られ、それをコントローラ側で受け取って加工し、ビューに渡すという構造は、どんなWebアプリケーションでも共通して必要となる重要な基本です。今回の記事で扱ったHTMLフォーム、コントローラの処理、ビューでの表示という三つの動きが理解できると、ユーザー登録や商品注文、問い合わせフォームなど、あらゆるアプリケーションの機能を自分で設計できるようになります。さらに、実務では複数のパラメータを扱う場面や、オブジェクトへの自動バインディング、入力チェック、エラーメッセージの出力など、より高度な機能が必要になることが多く、それらの基礎となるのが今回学んだ仕組みです。
フォームとコントローラの関係性を理解すると、例えば次のようなコードが「なぜこのように動くのか」を自然と説明できるようになります。以下は、今回の記事内容を踏まえた簡単なサンプルコードです。
@Controller
public class SampleController {
@PostMapping("/echo")
public String echoMessage(@RequestParam("text") String text, Model model) {
model.addAttribute("result", "入力された文字は「" + text + "」です。");
return "echo-result";
}
}
この程度のコードであれば、今のあなたなら「フォームで入力 → リクエストパラメータとして送信 → コントローラで受け取る → ビューに渡す」という一連の流れをもう迷わずに説明できるはずです。実際の開発でも、この理解があるだけで作業効率が大きく変わり、フォーム入力を扱う画面を自信を持って作れるようになります。
さらに、@ModelAttributeを使ったオブジェクトへの自動バインディングをマスターすれば、複数の項目をまとめて扱うような場面でもスッキリとしたコードを書けるようになります。これは保守性に大きく関わるため、現場ではとても評価されるスキルです。たとえば次のようなコードは、入力フォームととても相性が良く、実務でも頻繁に登場します。
@PostMapping("/register")
public String registerUser(@ModelAttribute("user") User user, Model model) {
model.addAttribute("message", user.getName() + "さんの登録が完了しました。");
return "register-result";
}
フォーム処理の全体像が見えるようになると、「画面側でどのname属性をつけるべきか」「パラメータ名を間違えるとどうなるか」「必須チェックをどう書くか」など、実際の開発でも役立つ知識が自然と身についていきます。さらに、画面入力のミスによるエラーや、バインディング失敗の原因などにもすぐ気づけるようになり、トラブルシューティング能力が高まります。
今後は、バリデーションの追加、エラーメッセージのハンドリング、複雑な入力画面の設計、データベースとの連携など、フォーム処理を拡張していく場面が増えていきます。今回理解した「リクエストパラメータの取得」という基本が、これらすべての基盤となるため、この段階をしっかり押さえておくことがとても大切です。ぜひ今回の内容を活かして、より高度なSpring MVCの開発へ進んでみてください。
生徒「フォームからの入力って難しいと思っていましたが、仕組みがわかると意外と単純なんですね。」
先生「そうなんだ。流れを理解すると、Spring MVCはとても扱いやすいフレームワークだということが実感できるよ。」
生徒「@RequestParamで名前を拾って、Modelでビューに渡す仕組みも自然に理解できました!」
先生「その調子。次は@ModelAttributeを使ったオブジェクトの受け取りも実務では重宝されるよ。」
生徒「入力フォームを増やしたり、複数項目をまとめて扱うのも簡単になりそうです。」
先生「まさにそれがSpring MVCの強み。今後の学習にも今回の理解がしっかり役に立つはずだよ。」
生徒「実際に自分でも簡単な入力アプリケーションを作ってみたくなりました!」
先生「ぜひ挑戦してみて。実践すればさらに理解が深まるよ。」