| この記事の要点 |
|---|
|
本稿は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 / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38