Springを学んで2ヶ月目の自分が学習したことを定着させたいと思い、自分の言葉でまとめた。
タイムリーフのお話
value属性
フロントからデータを送る場合は、th:value = usernameのようにinputタグの中のvalue属性の中にthをつけなければいけないとバックエンド側に送られないと思っていた。しかし、プログラミング系のバイトをしているとフロントのフレームワークを連携してその記法でvalueに設定された値でも送れることを知った。そこでなぜなのかと色々調べていると、サーバー側に送られるのはどういう形でもいいが、サーバー側の値をフロントで使うためにはタイムリーフの記法を使わなければいけないらしい。また、サーバー側で@RequestParam("username") String usernameのようにusernameの中にフロント側で入力された値を紐付けたい場合は、th:name = usernameをつけると紐づく。これも、th:value usernameとしなくてもサーバー側に値が送られる要因だと考えられる。
th:objectについて
サーバー側で@ModelAttribute("object") Test testとした時に、フロント側でth:object = ${object}とするとtestに定義されているフィールド名が参照可能になり、表示することができる
th:valueとth:fieldの違い
私は、最初の「value属性」という章でも記述した通り、th:valueのみが値をサーバー側に送っているものだと思っていた。しかし、実際はinputタグのname属性に割り当てられた名前がサーバー側の@RequestParam("name")と紐づけられnameという名前でvalue属性の値が格納されるというものだった。フロントに表示される仕組みはデータを送る逆。そのため、th:valueはth:nameがないとサーバーとバインドができない。しかし、th:fieldは、th:nameとth:valueの二つの機能を持つ。
<input type="text" th:name="name" th:value="${user.name}"/>
th:value使うと上記のコードのように書けるものが、th:fieldを使うと、
<form th:object="${user}">
<input type="text" th:field="*{name}" />
</form>
このように書ける。
th:fieldはth:objectを伴って使うため、使い分けとしては、単純な値を処理するかどうかで決まる。th:fieldがth:objectを使う理由は、どのオブジェクトを参照すればいいかが不明なため。