| この記事の要点 |
|---|
|
本稿はSpring Frameworkにおいてビュー→モデル→コントローラーに値を渡す方法を説明します。
ビュー
元のフォーム・モデル・コントローラの例は以下に残しています。モデルのgetter/setterの未定義名だけを訂正しました。ここでいうモデルは入力を受け取るフォームオブジェクトで、DBへ保存済みのEntityを意味しません。
|
<form action="index" method="get"> |
モデル
|
public class UserModel { private String userId; public void setUserId(String userId) { |
コントローラー
|
@Controller @ModelAttribute String userId = userModel.getUserId(); |
name属性とJavaプロパティの対応
| 位置 | 値・役割 |
|---|---|
| inputのname | userId。送信されるパラメータ名 |
| inputのid | 画面側で要素を識別する名前。nameの代用にはならない |
| フォーム | userIdフィールドとsetUserId/getUserId |
| コントローラ | 受け取ったフォームからgetUserId()で値を取得 |
元のGETフォームでは/index?userId=Taroのようなクエリから値を受け取ります。action="index"は相対URLなので、画面の位置やアプリのコンテキストパスも確認してください。JSON本文を送るAPIの@RequestBodyとは別の仕組みです。
コンパイル・バインドを確認した独立例
Spring Framework 6.2.12 / Java 21で、次の3ファイルを同じexampleパッケージに置き、MockMvcとDataBinderで検証しました。旧コードへ新しい依存を混ぜて貼る例ではありません。既存アプリには、その版の依存・コントローラ検出・MVC設定を確認して組み込んでください。
UserModel.java
package example;
public class UserModel {
private String userId;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
}UserModelValidator.java
package example;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
public class UserModelValidator implements Validator {
@Override
public boolean supports(Class<?> type) {
return UserModel.class.isAssignableFrom(type);
}
@Override
public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "userId", "required");
String value = ((UserModel) target).getUserId();
if (value != null && value.length() > 40) {
errors.rejectValue("userId", "tooLong");
}
}
}この例の仕様は「userIdは空白だけでなく、40文字以内」です。実システムのID形式・存在確認・権限確認とは別なので、業務仕様に合わせて変更します。
IndexController.java
package example;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class IndexController {
@InitBinder("userModel")
public void configure(WebDataBinder binder) {
binder.setAllowedFields("userId");
binder.setValidator(new UserModelValidator());
}
@GetMapping("/index")
@ResponseBody
public ResponseEntity<String> index(
@Validated @ModelAttribute("userModel") UserModel form,
BindingResult result) {
if (result.hasErrors() || result.getSuppressedFields().length > 0) {
return ResponseEntity.badRequest().body("invalid input");
}
return ResponseEntity.ok()
.header("Content-Type", "text/plain;charset=UTF-8")
.body(form.getUserId());
}
}InitBinderはuserModelへのプロパティバインドをuserIdだけに限定します。Validatedで登録したValidatorを呼び、直後のBindingResultでエラーを受け取ります。この例は許可外キーが除外された場合も400で拒否する設計です。すべてのSpringアプリが余分なキーで自動的に400になるわけではありません。
成功時は確認用にuserIdをtext/plainで返し、DBへ保存しません。画面のHTMLへ表示する実アプリではテンプレートのエスケープを維持してください。元のvoidコントローラとは違って確認用レスポンスを明示しています。旧void例ではビュー名の解決と対応テンプレートが別途必要です。
検証した受け取り結果
| 入力 | 結果 |
|---|---|
| userId=Taro | 200、本文Taro |
| userIdなし・空白のみ・41文字 | 400、検証失敗 |
| id=Taro | 400。userIdの代わりにはならない |
| userId=TaroとisAdmin=true | 許可外キーを検出し400 |
| HTMLのような文字列 | text/plainとして返す。HTMLとして実行しない |
受け取れないときと安全上の注意
- 送信先URL・HTTPメソッド・inputのnameを確認する。disabledの入力など、送信されない項目にも注意する。
- フィールド、getter、setter、ModelAttribute名、InitBinderの対象名を照合する。
- BindingResultの配置、検証失敗、除外されたフィールドを確認する。秘密情報を入力全体ごとログへ出さない。
- 値のバインドはログイン・所有者確認・DB保存を代行しない。永続化用Entityを直接バインドしない。
- GETは今回の読み取り確認用。更新を伴う処理は適切なメソッドとCSRF対策・認可・保存時の失敗処理を別途設計する。
今回の8テストはコンパイル、getter/setter、SpringのMockMvc/バインド/検証までです。実ブラウザからのフォーム送信、認証/CSRFフィルタ、ビュー描画、DB保存を含む本番アプリ全体は未検証です。
公式資料: Spring 6.2のModelAttribute、Data Binding(2026年10月確認)。
子ページはありません
- インストール(eclipseプラグイン)
- クイックスタート
- プロジェクトの作成
- Spring Bootプロジェクトの作成
- Spring Bootプロジェクトの実行
- Spring BootでHello World!
- アノテーション一覧
- DB接続設定からエンティティおよびリポジトリの作成、値の取得まで(JPA編)
- DB接続設定や値の取得(JdbcTemplate編)
- ビューから値をモデルに格納しコントローラーで受け取る方法
- コントローラーにてモデルに値を格納してビューに渡す方法
- テンプレートエンジン
- ModelとModelAndViewの違い
- AOPの使用方法
- classpath: 内部ファイルの読み込み
- file: 外部ファイルの読み込み
- CSVファイルアップロード方法(Ajax)
- CSVファイルダウンロード方法(Ajax)
- Spring Bootプロジェクトのビルドと本番環境へのデプロイ方法(内部tomcat使用)
- Application.propertiesの環境依存設定の分割方法
- JPAにおけるEntityManagerの取得方法
- JPAにおけるjava.sql.Connectionの取得方法
- エラー一覧
- jarの引数を受け取る方法
- Spring BootでGmailからメール送信
- 複数のDBに接続する設定(Spring Boot & JPA編)
- ポート番号の変更
- Basic認証の実装と特定のURLに限定する方法
- Spring SecurityのBasic認証の無効化
- 独自のエラーページを定義する方法
- プロパティファイルの値やjar実行時の引数を取得する方法
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09