55798


[このページを参照：Spring Bootで簡単な検索アプリケーションを開発する --
Qiita](https://qiita.com/rubytomato@github/items/e4fda26faddbcfd84d16)

**質問1**  
`save.html`の`th:object="${actorForm}"`の所でactorFormとありますがそれ以外の所で`addAttribute("actorForm",
)`や`addObject("actorForm", )`した形跡が見られません。  
このactorFormというのはどこから出てきたんでしょうか？

**質問2**  
このコントローラーのformはどこで使われているのですか？受け取っている意味はなんですか？

[code]

    @RequestMapping(value = "/actor/create", method = RequestMethod.GET)
      public String create(ActorForm form, Model model) {
        logger.debug("Actor + create");
        List<Prefecture> pref = prefectureRepository.findAll();
        model.addAttribute("pref", pref);
        modelDump(model, "create");
        return "Actor/create";
      }
    
[/code]

以上Springの検証関係についての質問です。


CC BY-SA 4.0
2019-06-14T16:53:39.750
55790
2019-06-17T01:37:22.160
2019-06-14T17:24:30.467
19110
15607
question
java spring spring-boot thymeleaf
Spring & Thymeleaf の検証に関して


※ぱっと見での回答です。

質問1については画面の表示の際にエラーになりそうな気がしますが、未設定であれば無視されるのかもしれませんね。もしくは、参考にしたページで紹介されていない部分で`addObject("actorForm",
)`してるのかも。

質問2については意味はないですね。Springのコントローラーでは、処理に必要なものだけメソッドの引数に指定すればいいので、`ActorForm
form,`の部分は不要です。あってもエラーにはならないので、特に問題はないですが。


CC BY-SA 4.0
2019-06-15T01:19:08.723
55792
2019-06-15T01:38:52.257
2019-06-15T01:38:52.257
21092
21092
55790
answer


[Method Arguments - 1.3.3. Handler Methods - Spring
MVC](https://docs.spring.io/spring/docs/current/spring-framework-
reference/web.html#mvc-ann-arguments)の表の一番最後の説明が該当します。

> it is a resolved as a @RequestParam. Otherwise, it is resolved as a
> @ModelAttribute.

今回の場合はリクエストパラメータでもないので
[`@ModelAttribute`](https://docs.spring.io/spring/docs/current/spring-
framework-reference/web.html#mvc-ann-modelattrib-method-args) です。

> @ModelAttribute annotation on a method argument to access an attribute from
> the model or have it be **instantiated if not present**.

なので `/actor/create` のGETフローだけを考えると次のコードと等価かと思います。

[code]

      @RequestMapping(value = "/actor/create", method = RequestMethod.GET)
      public String create(Model model) {
        model.addAttribute("actorForm", new ActorForm());
        // ...
        return "Actor/create";
      }
    
[/code]

(ただしそのコードでは[保存ボタンを押したときのvalidationエラー時](https://github.com/rubytomato/actor-
search-
example/blob/be72c89d5b/src/main/java/com/example/actor/web/ActorController.java#L116)でも使っているようなので、このように無条件に新規オブジェクトを設定すると入力値が消えます。)

ここで用いられている属性名`actorForm`は次のルールで暗黙的に決定されます。

  * [1.3.4. Model - Spring MVC](https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-modelattrib-methods)

> When a name is not explicitly specified, a default name is chosen **based on
> the Object type** , as explained in the javadoc for
> [Conventions](https://docs.spring.io/spring-
> framework/docs/5.1.8.RELEASE/javadoc-
> api/org/springframework/core/Conventions.html).

    * (Conventionsの指す先が自明ではありませんがおそらく…) [getVariableName](https://docs.spring.io/spring-framework/docs/5.1.8.RELEASE/javadoc-api/org/springframework/core/Conventions.html#getVariableName-java.lang.Object-)

> The convention used is to return the un-capitalized short name of the Class,
> according to JavaBeans property naming rules.  
>  For example:  
>  com.myapp.Product becomes "product"  
>  com.myapp.MyProduct becomes "myProduct"  
>  com.myapp.UKProduct becomes "UKProduct"

要するに、

> クラス名の頭文字を小文字化したactorFormということでしょうか？

考えられているとおりです。

* * *

Thymeleaf については全く知りませんが、次のリンクが参考になるかなと思いました。

  * [6.1 Handling the command object - Tutorial: Thymeleaf + Spring](https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html#creating-a-form)
  * [Handling Form Submission - Spring Guides](https://spring.io/guides/gs/handling-form-submission/)


CC BY-SA 4.0
2019-06-15T03:03:56.343
55798
2019-06-17T01:37:22.160
2019-06-17T01:37:22.160
2808
2808
55790
answer