質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

1030閲覧

SpringBootのデータ登録、処理について

monkari

総合スコア4

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/12/07 13:09

現在springbootの学習を進めている最中です。
参考書に従いソースを作成し、想定どおり動くことを確認できております。
しかし、なぜそのように動くかが分かりません。
分からないことは下記に箇条書きします。

①登録ボタンを押すとデータが登録されるかと思いますが、その時の処理の流れ(@Setterや@Getterが動いているのだろうと思いますが、いまいちピンと来てない)
②list.htmlで、「<div th:each="comment : ${comments}">」の箇所がありますが、「comments」はどこからきたのか

有識者の方、もしよければご教示ください。

コントローラー

package

1 2import org.springframework.stereotype.Controller; 3import org.springframework.ui.Model; 4import org.springframework.validation.BindingResult; 5import org.springframework.validation.annotation.Validated; 6import org.springframework.web.bind.annotation.GetMapping; 7import org.springframework.web.bind.annotation.ModelAttribute; 8import org.springframework.web.bind.annotation.PostMapping; 9 10import com.example.demo.model.Comment; 11import com.example.demo.repository.CommentRepository; 12 13@Controller 14public class CommentController { 15 16 private final CommentRepository repository; 17 18 public CommentController(CommentRepository repository) 19 { 20 this.repository=repository; 21 } 22 23 @GetMapping("/") 24 public String getAllComments(@ModelAttribute Comment comment, Model model) 25 { 26 model.addAttribute("comments",repository.findAll()); 27 return "list"; 28 } 29 30 @PostMapping("/add") 31 public String addComment(@Validated @ModelAttribute Comment comment, BindingResult result, Model model) 32 { 33 model.addAttribute("comments",repository.findAll()); 34 if(result.hasErrors()) 35 { 36 return "list"; 37 } 38 repository.save(comment); 39 return "redirect:/"; 40 } 41 42}

モデル

package

1 2import javax.persistence.Entity; 3import javax.persistence.GeneratedValue; 4import javax.persistence.Id; 5import javax.validation.constraints.NotBlank; 6import javax.validation.constraints.Size; 7 8import lombok.Getter; 9import lombok.Setter; 10 11@Getter 12@Setter 13@Entity 14public class Comment { 15 @Id 16 @GeneratedValue 17 private Long id; 18 19 @NotBlank 20 @Size(max=40) 21 private String content; 22 23}

ビュー

<html xmlns:th ="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h3>一言コメント</h3> <form th:action="@{/add}" th:object="${comment}" method="post"> <label for="content">コメント</label> <input type="text" th:field="*{content}"> <button>登録</button> <br> <small style="color:red" th:errors="*{content}"></small> </form> <br> <h3>一覧</h3> <div th:each="comment : ${comments}"> <div> [[${comment.id}]] - [[${comment.content}]] </div> </div> </body> </html>

リポジトリ

package

1 2import org.springframework.data.jpa.repository.JpaRepository; 3 4import com.example.demo.model.Comment; 5 6 7public interface CommentRepository extends JpaRepository<Comment, Long>{ 8 9 10}

データローダー

package

1 2import org.springframework.boot.CommandLineRunner; 3import org.springframework.stereotype.Component; 4 5import com.example.demo.model.Comment; 6import com.example.demo.repository.CommentRepository; 7 8import lombok.RequiredArgsConstructor; 9 10@RequiredArgsConstructor 11@Component 12public class DataLoader implements CommandLineRunner 13{ 14 private final CommentRepository repository; 15 16 17 @Override 18 public void run(String... args) throws Exception 19 { 20 Comment comment= new Comment(); 21 comment.setContent("こんにちわ"); 22 repository.save(comment); 23 24 25 comment = new Comment(); 26 comment.setContent("テストコメント"); 27 repository.save(comment); 28 29 } 30 31} 32

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー


@ModelAttributeアノテーションをつけることで、ゲッター、セッターを持つクラスのフィールドに対し、リクエストをバインドすることができます。
そのためform内の要素のname属性値とフィールド名は一致させなければなりませんし、フィールドに何かしらの制約(今回だと@NotBlankや@Sizeのような)をアノテーションとして付与した場合、入力内容がそぐわない場合はエラーとなり、バリデーションの役割も果たします。


model.addAttribute
でちゃんと指定されていますね。
第1引数の名称でViewで呼び出すと第2引数の情報が参照できます。

いずれにしても書籍に全て頼るのではなく公式のドキュメントは常に傍らに置いといたほうが良いです。

投稿2021/12/08 00:21

m.ts10806

総合スコア80861

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

monkari

2021/12/10 12:22

ご回答いただきありがとうございます。 反応が遅くなってしまい申し訳ありません。 なんとなくわかってきたような、もう少し考える時間が必要なので一旦ベストアンサーにさせていただきます。 また、困った時があればお力お貸しいただければ幸いです。
m.ts10806

2021/12/10 12:49

色々試して成功や失敗していくのもやり方としてはあります。話を見聞きしただけじゃプログラム動きませんしね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問