66542
`@ModelAttribute`の使用方法とその解説がサイトによって違って混乱しています。  
どのように使用するのでしょうか？
CC BY-SA 4.0
2020-05-12T12:32:04.893
66541
2020-05-12T13:11:21.087
9008
question
java spring spring-boot
@ModelAttributeの使用方法とその解説がサイトによって違って混乱しています。どのように使用するのでしょうか？
混乱の理由は、使用方法が２つあるからでした。  
つまり書く場所によって意味が異なります。  
（もしかしたら私が気づいてない同じ意味合いがあるのかもしれない）

# 2つの使用方法

使用方法が大きく２つあります。

  * パラーメータ内にアノテーションがある場合
  * メソッドのアノテーションの場合

の２つです。

## パラーメータ内にアノテーションがある場合

```

    @RequestMapping(...)
    public xxx handlePersonRequest(@ModelAttribute Person person, xxx){
                                   ^^^^^^^^^^^^^^^
      ...
    }
    
```

となっているのが、「パラーメータ内にアノテーションがある場合」です。  
主な用途としては`リクエスト`でやってきた`フォーム`からのデータを受け取るときに使うこととなります。  
「`person`変数に`フォーム`の値を詰めてね」といったような意味合いになります。

（補足）厳密にはGETリクエストのようにデータが渡ってこない場合は `new Person()` の状態の空のオブジェクトが生成されるようだ

## メソッドのアノテーションの場合

```

    @ModelAttribute
    public Person createPerson(){
      return new Person();
    }
    
```

となっているのが、「メソッドのアノテーションの場合」の場合です。  
`@Controller`内の`@RequestMapping`のメソッドの実行前にこのメソッドが呼ばれます。

「`createPersonメソッド`が`Person`オブジェクトを返すので、`@RequestMapping`内のメソッドでいい感じに使ってくれ」  
というような意味合いになります。

この生成されたオブジェクトは`Model`に自動的に付与されているので、`ビュー（Thymeleaf等）`側で使用できます。

### 参考

  * <https://stackoverflow.com/a/14616749/1979953>
  * [Springで画面の入力値を受け取る - Qiita](https://qiita.com/NagaokaKenichi/items/ea61420b01d37189d997)
  * [@ModelAttribute を使う](https://kazkn.com/post/2017/use-model-attribute/)
  * [15\. Web MVC framework](https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-modelattrib)

* * *

**蛇足**  
最初に書いた「（もしかしたら私が気づいてない同じ意味合いがあるのかもしれない）」の自分なりの理解としては、

「パラーメータ内にアノテーションがある場合」「メソッドのアノテーションの場合」どちらも、`@ModelAttribute`はコントローラ内のメソッドが走る前に処理されるという部分で同じである。

  * 「パラーメータ内にアノテーションがある場合」は内部的にメソッドが走る前に`フォーム`の値が詰め込まれる
  * 「メソッドのアノテーションの場合」は内部的にメソッドが走る前に `アノテーションが付いたメソッドの返り値` が詰め込まれる
CC BY-SA 4.0
2020-05-12T12:32:04.893
66542
2020-05-12T13:11:21.087
2020-05-12T13:11:21.087
9008
9008
66541
answer