arcanum_jp’s blog

おっさんの日記

Wicket PropertyModelの利点はコレか??

 まさかぁ!!とは思うけど。


 正直、ササッと作るときにはモデルって考え方が非常にウザく感じた。コンポーネントのコンストラクタでモデルを指定しなかったら勝手にnew Model()をしてくれ!とか。でも、更新可能なテーブルを作るには、コレではまずくてPropertyModelを使用しなくてはならないけど。

 そんなコンポーネントのほかにモデルを意識しなくてはならないってのが結構便利だったり、時にはウザかったりするけど、なんでモデルがあるんだろうと自分なりに考えてみた。こんな感じかな??


 
 Clickなんかではモデルの考え方がないために、画面で更新ボタン処理を書くときは、ページクラスで保存したオブジェクトから値を取得して更新項目を編集って感じだと思う

public class TestC extends Page{

    private TextField _loginname = new TextField("loginname");
    private PasswordField _pass  = new PasswordField("pass");
    private Submit _update = new Submit("update", "更新", this, "clickUpdate");

    private Form _form = new Form();

    public void Test(){
        add(_form);
        _form.add(_loginname);
        _form.add(_pass);
    }

    public void onGet(){
        // データベースから値を持ってくる
        
        _loginname.setValue(データベースから持ってきた値);
        _pass.setValue(データベースから持ってきた値);
    }

    public boolean clickUpdate(){

        // ここで値を取得するって行為が発生する。
        String slog = _loginname.getValue();
        String spas = _pass.getValue();

        /*
         *  ここで値を使って更新する
         *
         */

        update(slog,spas...);

    }


}

 上記でのポイントは、更新しようって時に、各コンポーネントから値を取得するって所。

 WicketのPropertyModelの考え方を使えば、Pageオブジェクトに保存したインスタンス変数と、ページが管理する複数のコンポーネントの値が同期するので、各コンポーネントには、ページが保存しているインスタンス変数(モデル)を設定すれば、あとはWicketがよしなにやって、値を自動的に更新してくれる。あとは、実装者は更新対象のオブジェクトだけを見ればいいようになる。(理想論だけどね)

public class TestW extends WebPage {

    private TextField _loginname = new TextField("loginname");
    private PasswordField _pass  = new PasswordField("pass");
    Button _update = new Button("update", "更新"){
        public void onSubmit(){
            clickUpdate();
        }
    };

    private Form _form = new Form();

    private HogeData _target; // これが更新対象データ

    public TestW(){

        _form.add(_loginname);
        _form.add(_pass);

       // データベースから値を持ってくる
       List list = getHogeList(); 

       // データベースから持ってきた値を_targetに保存する
       _target = (HogeData)list.get(0);       
 
       // データベースから持ってきた値とコンポーネントを同期化する
       _loginname.setModel(_target);
       _pass.setModel(_target);

    }

    private void clickUpdate(){

        /*
         * _targetを直接使って更新処理を書く
         */

        pudate(_target.getLogin(), _target.getPass() ...);

    }

}


 こうなってくると、どうなんだろう。GEFなんかと同じでモデルの設計が重要になってくるような気がする。単なるStringやプリミティブ型だけを保存するようなオブジェクトではなくて、画面の値を階層的に管理するようなモデルの設計。

 そうすると、バックエンドなんかもアクセスした値を任意のモデルに透過的に設定、任意のモデルから透過的に更新する仕組みを作らなくてはならなくなるのかな??


 1つとにかく作ってみて、感じた事を書いてみた。間違っていたら誰か教えてください。