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 ) { ....
今回の例では、フォームの入力項目は多くないですので、効果は明らかではないですが、
フォームの入力項目が増えると、もっと便利になれます。