JavaのWebアプリケーション開発フレームワークによる、Webサイト開発の顛末記です。

EclipseのMavenを使った、Spring-MVC、Thymeleaf、MyBatis 等のプログラミングテクニックを、
備忘録的に記録しています。実際に動くソースコードを多用して説明していますので、
これからEclipseや、Spring-MVCを始めたいと思っている人にとって、少しでも参考になれば幸いです。
Spring-MVCの散歩道 > SpringMVC の小径 > 第7歩 Spring-MVC 迷いの一歩 > データモデルバインド

package jp.dip.arimodoki.cntl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import jp.dip.arimodoki.model.PromenadeFormIf;

/**
 * 面倒なので、このソースのコメントで全部説明しちゃうぞ
 */
@Controller    //このクラスはコントローラです。
public class Promenade {
    /**
     * このコントローラは、PromenadeFormクラスを
     * リクエスト/レスポンス用パラメータの入れ物(FormBean)として使います
     */
    @Autowired        //ここでPromenadeFormを、DIしてインスタンスを生成しておきます
    private PromenadeFormIf promenadeForm;    //DIする変数の型は、クラスではなくインターフェースとします

    /**
     * PromenadeFormクラスを、"PromenadeFormData"という名前で、Modelにバインドします。
     * この処理を行うことで、viewにレスポンスする場合は
     * 特にレスポンス処理を明記しなくても、自動的にModelがviewに返却され
     * view側(Thymeleaf側)では、PromenadeFormData.プロパティ名 
     * でFormBeanのプロパティが参照可能となります。
     * ※)@ModelAttributeアノテーションのバインド名が重要であって、
     *   メソッド名はなんでも構いません(クラス内で重複しなければ)
     * @return バインドされたFormBeanのインターフェース PromenadeFormIfを返します。
     */
    //"PromenadeFormData"という名前で、PromenadeFormクラスをModelにバインドします
    @ModelAttribute("PromenadeFormData")
    public PromenadeFormIf setupBind(        //メソッド名はなんでもよかとです。
            //今回はメソッドの引数は必要ないので何もありません
        ) {

        //
        //特にやることはありません。必要があればPromenadeFormの
        //プロパティの初期化など、必要に応じて処理を組み込むことも可能です。
        //

        return this.promenadeForm;            //上でDIされた(インスタンス化された)FormBeanを返します。
    }

    /**
     * コントローラメソッドです。
     */
    @RequestMapping(value = "/promenaderes")        //URLパスマッピング
     public String promenade(
        //上でモデルをバインドしておいたバインド名"PromenadeFormData" でパラメータを受け取ります
        //引数の型は、PromenadeFormIf(クラスではなくインターフェース)
        @ModelAttribute("PromenadeFormData") PromenadeFormIf formbean    //viewからPromenadeFormでリクエストを受け取る
        ) {

        //※)このメソッドの引数 formbeanと、バインドされたクラス変数 this.PromenadeForm
        //  は、全く同じものです。formbean == this.PromenadeForm
        //  なので、メソッド内で、formbean.xxx でアクセスしても、this.PromenadeForm.xxxでアクセスしても結果は同じです。

        //リクエストパラメータの内容確認してみる
        System.out.println("formbean.myname["+formbean.getMyname()+"]");
        System.out.println("formbean.age["+formbean.getAge()+"]");
        System.out.println("formbean.pref["+formbean.getPref()+"]");
        System.out.println("formbean.phone["+formbean.getPhone()+"]");
        //ダメ押し(this.promenadeFormでアクセスしてみる)⇒上と同じ結果が出ることが期待できる
        System.out.println("this.promenadeForm.myname["+this.promenadeForm.getMyname()+"]");
        System.out.println("this.promenadeForm.age["+this.promenadeForm.getAge()+"]");
        System.out.println("this.promenadeForm.pref["+this.promenadeForm.getPref()+"]");
        System.out.println("this.promenadeForm.phone["+this.promenadeForm.getPhone()+"]");

        //viewにレスポンスするときは、
        //わざわざ model.addAttribute("myformbean", formbean);
        //とかやらなくても、すでにModelにバインドされているので自動的にformbeanがレスポンスされます。
        //view側(Thymeleaf側)では、モデルのバインド名"PromenadeFormData" で
        //PromenadeFormData.プロパティ名で、FormBeanのプロパティにアクセスできます。

        //WebContent/promenaderes.html を描画する
        return "promenaderes";
    }
}