質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

7217閲覧

引数につける@ModelAttributeに属性名をつけるのとつけないものの違い

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2019/08/21 05:24

STSを学習中の初学者です。

テキストを使用してSTSの勉強をしております。

その中で、フォームによるパラメータの受け渡しを@ModelAttributeを使用して行うことに関してわからないことがあります。

@ModelAttributeアノテーションを使用すると、どうやらフォームで送信されたパラメータ(オブジェクト)をエンティティのインスタンスにバインドするらしいということは理解できたのですが、

メソッドの引数に@ModelAttributeのアノテーションを付けたときに、@ModelAttribute("属性名?")と@ModelAttributeのようにアノテーションの後に属性名?が付く場合と付かない場合があり、この2つの違いについて教えていただきたいです。

具体例をあげると以下のようなcontrollerとviewのセット2パターンです。
ざっくり問題の箇所が見えればいいと思ったので、中身をかいつまんだコードになっております。

エンティティ-は両方共通で以下のものです。

java

1@Getter 2@Setter 3@Entity 4@Table(name = "mydata") 5public class MyData { 6 7 @Id 8 @GeneratedValue(strategy = GenerationType.AUTO) 9 @Column 10 private long id; 11 12 @Column(length = 50, nullable = false) 13 private String name; 14 15 @Column(length = 200, nullable = true) 16 private String mail; 17 18 @Column(nullable = true) 19 private Integer age; 20 21 @Column(nullable = true) 22 private String memo; 23 24}

@ModelAttribute("属性名?")パターン

フォームから送信されたものをデータベースに保存するものです。
更新ではなく新規保存です。

view

html

1<body> 2 <table> 3 <form method="post" action="/" th:object="${formModel}"> 4 <tr> 5 <td><label for="name>名前</label></td> 6 <td><input type="text" name="name" th:value="*{name}" /></td> 7 </tr> 8 <tr> 9 <td><label for="name>年齢</label></td> 10 <td><input type="text" name="age" th:value="*{age}" /></td> 11 </tr> 12 <tr> 13 <td><label for="name>メール</label></td> 14 <td><input type="text" name="mail" th:value="*{mail}" /></td> 15 </tr> 16 <tr> 17 <td><label for="name>メモ</label></td> 18 <td><textarea name="memo" th:value="*{memo}" cols="20" rows="5"></textarea></td> 19 </tr> 20 </form> 21 </table> 22 <hr/> 23 <table> 24 <tr> 25 <th>ID</th> 26 <th>名前</th> 27 </tr> 28 <tr th:each="obj : ${datalist}"> 29 <td>${obj.id}</td> 30 <td>${obj.name}</td> 31 </tr> 32 <table> 33</body>

controller
見ての通りですが、
GETのfindAll()メソッドでデータベースのmydataテーブルにあるデータを取り出しています。
POSTでは送信されたフォームをクラスにバインドしたインスタンスにして受け取り保存しています。

java

1@Controller 2public class HelloController { 3 @Autowired 4 MyDataRepository repository; 5 6 @RequestMapping(value = "/", method = RequestMethod.GET) 7 public ModelAndView index(@ModelAttribute("formModel") MyData mydata, 8 ModelAndView mav) { 9 mav.setViewName("index"); 10 mav.addObject("msg", "this is sample content."); 11 Iterable<MyData> list = repository.findAll(); 12 mav.addObject("datalist", list); 13 } 14 15 @RequestMapping(value = "/", method = RequestMethod.POST) 16 @Transactional(readonly = false) 17 public ModelAndView form(@ModelAttribute("formModel") MyData mydata, 18 ModelAndView mav){ 19 repository.saveAndFlush(mydata); 20 return new ModelAndView("redirect:/"); 21 } 22}

@ModelAttributeパターン

指定したIDのデータをフォームに表示し、フォームで編集して送信したもので、
既存のデータを上書きする処理です。

view

html

1<body> 2 <table> 3 <form method="post" action="/edit" th:object="${formModel}"> 4  <input type="hidden" name="id" th:value="*{id}"/> 5 <tr> 6 <td><label for="name>名前</label></td> 7 <td><input type="text" name="name" th:value="*{name}" /></td> 8 </tr> 9 <tr> 10 <td><label for="name>年齢</label></td> 11 <td><input type="text" name="age" th:value="*{age}" /></td> 12 </tr> 13 <tr> 14 <td><label for="name>メール</label></td> 15 <td><input type="text" name="mail" th:value="*{mail}" /></td> 16 </tr> 17 <tr> 18 <td><label for="name>メモ</label></td> 19 <td><textarea name="memo" th:value="*{memo}" cols="20" rows="5"></textarea></td> 20 </tr> 21 </form> 22 </table> 23 <hr/> 24 <table> 25 <tr> 26 <th>ID</th> 27 <th>名前</th> 28 </tr> 29 <tr th:each="obj : ${datalist}"> 30 <td>${obj.id}</td> 31 <td>${obj.name}</td> 32 </tr> 33 <table> 34</body>

controller
GETで指定されたIDのデータをフォームに埋め込んで表示します。
POSTでフォームで送信されたもので上書きをします

java

1@RequestMapping(value = "/edit/{id}", method = RequestMethod.GET) 2public ModelAndView edit(@ModelAttribure MyData mydata, 3 @PathVariable int id, 4 ModelAndView mav) { 5 mav.setViewName("edit"); 6 mav.addObject("title", "edit mydata."); 7 MyData data = repository.findById((long)id); 8 mav.addObject("formModel", data); 9 return mav; 10} 11 12@RequestMapping(value = "/edit", method = RequestMethod.POST) 13@Transactional(readOnly = false) 14public ModelAndView update(@ModelAttribure MyData mydata, 15 ModelAndView mav){ 16 repository.saveAndFlush(mydata); 17 return new ModelAndView("redirect:/"); 18}

以上の2つになります。

私個人は今回の2パターンの例では@ModelAttributeに(”属性名”)をつけても付けなくても、動作は変わらないのではないかなと思ってます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

一般に、動作は変わります。
@ModelAttribute()(属性名指定なし)は、引数にその型に基づく属性名を付与します。

Spring Framework 5.1.9.RELEASE APIによると、

java

1public ModelAndView update(@ModelAttribure MyData mydata, ModelAndView mav){

は、

java

1public ModelAndView update(@ModelAttribure("myData") MyData mydata, ModelAndView mav){

を指定したのと同じです。


今回、指定・未指定のいずれの場合でも正常に動作したのは、質問文に記載されていない遷移元ページの方で、属性名が正しく指定されていたからではないかと思います。

投稿2019/08/31 01:34

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問