SpringBoot フォームで入力チェックするサンプル
環境
SpringBoot 3
JavaSE 17
1.pom.xmlの定義
必要なライブラリです。spring-boot-starter-validationは、
入力チェックで使用します。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
2.値を送信する側のファイル(index.html)
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8" /> <title>submit</title> </head> <body> <form method="post" th:action="@{/test1/inputCheck}" th:object="${testForm}"> <p> 番号:<input type="text" th:field="*{id}" /></p> <div th:if="${#fields.hasErrors('id')}" th:errors="*{id}"></div> <p>ユーザー名:<input type="text" th:field="*{username}" /></p> <div th:if="${#fields.hasErrors('username')}" th:errors="*{username}"></div> <p>住所:<input type="text" th:field="*{addr}" /></p> <div th:if="${#fields.hasErrors('addr')}" th:errors="*{addr}"></div> <p><input type="submit" value="送信" /></p> </form> </body> </html>
3.コントローラのクラス(MainController.java)
コントローラで受信し@Validatedで入力チェックの対象になります。
package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.mvc.support.RedirectAttributes; @Controller @RequestMapping("/test1") public class MainController { @GetMapping("/login") public String login(Model model) { if(!model.containsAttribute("testForm")) { model.addAttribute("testForm", new TestForm()); } return "test1/index"; } @PostMapping("/inputCheck") public String inputCheck(@ModelAttribute("testForm") @Validated TestForm testForm, BindingResult brt, RedirectAttributes redirectAttributes) { if(brt.hasErrors()) { redirectAttributes.addFlashAttribute("org.springframework.validation.BindingResult.testForm", brt); redirectAttributes.addFlashAttribute("testForm", testForm); return "redirect:login"; } return "test1/testform"; } }
説明
画面の値がTestFormにセットされ、@Validatedで入力チェックが行われます。
以下のようにも書けます。
@ModelAttribute @Validated TestForm testForm
4.フォームのクラス(TestForm.java)
項目に追加した@NotNullアノテーション等で入力チェックします。
package com.example.demo; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Size; public class TestForm { @Pattern(regexp = "^[0-9]+$", message = "数値を入力してください") private String id; @Size(min = 4, max = 8, message = "4文字から8文字で入力してください") private String username; @NotBlank(message = "必須項目です") @Size(max = 8, message = "最大8文字までです") private String addr; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } }
説明
null 空文字("") 半角スペース NotNull エラーになる ok ok NotEmpty エラーになる エラーになる ok NotBlank エラーになる エラーになる エラーになる
5.値を受け取る側のファイル(testform.html)
th:object=のtestFormは、コントローラの値とひも付きます。
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8" /> <title>submit</title> </head> <body> <p>test ok</p> </body> </html>
6.実行して確認する
http://localhost:8765/test1/login