Spring Frameworkを利用して、WEBシステムを構築する場合、フォームはよく使われていますよね。
Spring Frameworkについて、以下のようにFormを構築することができます。(View側はThymleafを使う前提で)
<form action="staff/add" method="post">
<input type="text" name="name" value="${name}">
<input type="text" name="code" value="${code}">
</form>
そして、フォームを利用し、Controllerに送信する場合、以下のように、パラメータリクエストを利用して、入力した値を取得することができます。
@RequestMapping(path="/staff/add", method=RequestMethod.POST)
public String create(
@RequestParam("name") String name,
@RequestParam("code") String code,
Model model
) {
....
でも、以下のデメリットがあります。
- フォーム内部入力値が増えると、増えるほど、RequestParamが多くなります。コードが読みづらくなります。
- この形式で、バリデーション関連のアノテーションの追加が難しくなります
なので、フィールドを一個ずつ追加するではなく、全ての入力フィールドを1つのフォームオブジェクト(クラス)にまとめると、簡潔になれます。
上記の例では、
public class StaffForm implements Serializable {
private static final long serialVersionID = 1L;
@NotEmpty
private String name;
@NotEmpty
private String code;
// これからはnameとcodeのプロパティのsetterとgetter
...
}
そして、上記のViewのフォームは以下の形式に変更します。
<form action="staff/add" method="post" th:object="staffForm">
<input type="text" name="name" value="*{name}">
<input type="text" name="code" value="*{code}">
</form>
対応するControllerの部分は以下のように、簡潔な形になれます。
@RequestMapping(path="/staff/add", method=RequestMethod.POST)
public String create(
@RequestParam("staffForm") StaffForm staffForm,
Model model
) {
....
今回の例では、フォームの入力項目は多くないですので、効果は明らかではないですが、
フォームの入力項目が増えると、もっと便利になれます。

