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
) {

....

 

でも、以下のデメリットがあります。

  1. フォーム内部入力値が増えると、増えるほど、RequestParamが多くなります。コードが読みづらくなります。
  2. この形式で、バリデーション関連のアノテーションの追加が難しくなります

なので、フィールドを一個ずつ追加するではなく、全ての入力フィールドを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
) {

....

 

今回の例では、フォームの入力項目は多くないですので、効果は明らかではないですが、
フォームの入力項目が増えると、もっと便利になれます。