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に(”属性名”)をつけても付けなくても、動作は変わらないのではないかなと思ってます。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。