@GetMapping
コントローラーGreetingControllerから見ていきます。名前にもControllerと付いてわかりやすいですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package com.example.handlingformsubmission; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @Controller public class GreetingController { @GetMapping("/greeting") public String greetingForm(Model model) { model.addAttribute("greeting", new Greeting()); return "greeting"; } @PostMapping("/greeting") public String greetingSubmit(@ModelAttribute Greeting greeting, Model model) { model.addAttribute("greeting", greeting); return "result"; } } |
9行目に@Controllerの記述がありますが、これでこのクラスがコントローラーと宣言しています。
9 |
@Controller |
コントローラーはユーザ要求とモデル、モデルとビューを紐づける役割でした。12行目の@GetMapping(“/greeting”)がユーザ要求を定義しています。つまりユーザがブラウザで、
http://<サーバー名>:8080/greeting
と入力した際の紐づけが定義されます。
12 |
@GetMapping("/greeting") |
具体的な紐づけはその後の13行目から記述されており、メソッドgreetingFormが実行されることになります。
13 14 15 16 |
public String greetingForm(Model model) { model.addAttribute("greeting", new Greeting()); return "greeting"; } |
14行目で引数のmodelクラス.addAttributeメソッド利用して、ビューに引き渡す値を設定しています。ここでは、モデルGreetingのインスタンスを設定して名前を「greeting」としています。
そして15行目の「return “greeting”;」でビューgreetingの表示を行っています。
まとめるとユーザが
http://<サーバー名>:8080/greeting
と入力するとビューgreetingが表示されます。その際にモデルGreetingがインスタンス化され引き渡されます。
次は呼び出されるビューgreetingを見ていきましょう。
greeting.html
ビューgreetingはファイル「greeting.html」になります。ファイル種類がhtmlなので基本的にはhtmlのコードが書かれていますが、「th:」から始まる命令は、表示を行うThymeleafエンジンの命令になります。この命令によりモデルからデータを取得したり、モデルへデータを設定したりできます。「th:」を中心にコードを見ていきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<!DOCTYPE HTML> <html xmlns:th="https://www.thymeleaf.org"> <head> <title>Getting Started: Handling Form Submission</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <h1>Form</h1> <form action="#" th:action="@{/greeting}" th:object="${greeting}" method="post"> <p>Id: <input type="text" th:field="*{id}" /></p> <p>Message: <input type="text" th:field="*{content}" /></p> <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p> </form> </body> </html> |
最初にth:が出現するのは、9行目のformタグの中に二箇所あります。
9 |
<form action="#" th:action="@{/greeting}" th:object="${greeting}" method="post"> |
一つ目の「 th:action=”@{/greeting}”」でformタグのactionを「/greenting」と指定しています。
つまり、submitが実行されたなら、
http://<サーバー名>:8080/greeting
が発行されます。ここで覚えておいて欲しいのがformタグ内で「metod=”post”」と記述されているのでこのURLはpostで発行されるということです。
二つ目の「th:object=”${greeting}」で、これから操作するオブジェクトは「$greeting」であることを指定しています。
この「$greeting」は、コントローラーでインスタンスを設定した際の名前(“greeting”)にあたります。
14 |
model.addAttribute("greeting", new Greeting()); |
次にth:が登場するのは、10行目、11行目です。
10 11 |
<p>Id: <input type="text" th:field="*{id}" /></p> <p>Message: <input type="text" th:field="*{content}" /></p> |
それぞれ「th:field=”{・・・}”」の記述があります。このth:fieldはinputタグと上記で指定したオブジェクトのプロパティ(変数)を紐づける命令です。
例えば10行目の「th:field=”*{id}” 」の場合はオブジェクト$greeting(モデルGreetingのインスタンス)のプロパティidとinputタグを紐づけます。もしプロパティidに値が設定されているとデフォルト値として表示されます。※今回は設定されていないので表示されません。
まとめると、greeting.htmlが呼び出されると、inputタグ(id,content)とコントローラーで設定された$greeting(インスタンスGreenting)のプロパティ(id,content)が紐づけられます。もし$greetingのプロパティ(変数)id,contentに値が設定されていればそれぞれinputタグにデフォルト値として表示されます。そしてsubmitボタンが押されると、
http://<サーバー名>:8080/greeting
がpostで発行されます。
ビューの内容がわかりました。次に進みましょう。