Spring Frameworkでのフォーム利用


JavaのSpring Frameworkでフォームを作ってviewに渡すまでのサンプルです。
ここではSpringとLombokを使う前提とします。

🍄 Formオブジェクトの作成

まずはFormオブジェクトを作成します。

@Data
public class CommentForm {
@NotNull
@Size(min = 1, max = 127)
private String name;
@NotNull
@Size(min = 1, max = 1024)
private String comment;
}

😎 ControllerでFormを受け取る

FormクラスをControllerクラスで受け取ります。

@Controller
@RequestMapping("articles")
public class ArticleController {
private static final String VIEW_BASE = "articles/";
@ModelAttribute
public CommentForm setUpCommentForm() {
return new CommentForm();
}
// GET /articles
@GetMapping("")
public String index(Model model) {
return VIEW_BASE + "index";
}
// GET /articles/create
@GetMapping("create")
public String createForm(CommentForm form, Model model) {
return VIEW_BASE + "createForm";
}
// POST /articles/create?confirm
@PostMapping(value = "create", params = "confirm")
public String createConfirm(@Validated CommentForm form, BindingResult result, Model model) {
if (result.hasErrors()) {
return createRedo(form, model);
}
return VIEW_BASE + "createConfirm";
}
// POST /articles/create?redo
@PostMapping(value = "create", params = "redo")
public String createRedo(CommentForm form, Model model) {
return VIEW_BASE + "createForm";
}
// POST /articles/create
@PostMapping(value = "create")
public String create(@Validated AbcForm form, BindingResult result, Model model, RedirectAttributes redirectAttributes) {
if (result.hasErrors()) {
return createRedo(form, model);
}
// データの登録処理..
redirectAttributes.addFlashAttribute("message", "新規レコードを作成しました")
return "redirect:/articles";
}
}

@ModelAttributeでRequestMappingのついたメソッドの実行前に、受け取りたいFormクラスを初期化して返します。返り値はリクエストスコープに設定され、Thymeleafなどのビューから参照できます。

🚌 FormのボタンでPOST先のアクションを変える

Formの送信ボタンのnameオプションでPOST先のアクションを振り分ける方法を紹介します。

View側のHTMLはこちら。

<form>
<button type="submit" name="A">Aへ進む</button>
<button type="submit" name="B">Bへ進む</button>
</form>

Controller側のコードはこちら。

@PostMapping(value = "/wizard", params = "A")
public String wizardA() {
return "wizard_a";
}
@PostMapping(value = "/wizard", params = "B")
public String wizardB() {
return "wizard_b";
}

🐰 参考リンク

📚 おすすめの書籍