-値反映の方法

過去のBLOG、
http://d.hatena.ne.jp/masataka_k/20051018/1129598469
http://d.hatena.ne.jp/masataka_k/20051018/1129646946
http://d.hatena.ne.jp/masataka_k/20051019/1129714580
http://d.hatena.ne.jp/masataka_k/20051020/1129792024
http://d.hatena.ne.jp/masataka_k/20051021/1129890029
http://d.hatena.ne.jp/masataka_k/20051023/1130061202
と、JSR252とTapestryのフォーム入力をDTOに値反映させる方法について書いてたところ、Tapestryをやらずに終えてました。Tapestryは5.*系がスタートしているのでまた様子が変わるかもしれませんが、JSR252とTapestryについてショートコメントにまとめると以下の感じです。

  • JSR252(に限るところはちょっとだけ。JSF
    • 初めてのアクセス時、JSPを出力しないモードで描画してUIComponentのツリーをサーバ上に作る
    • このとき、非JSFのタグの出力はツリーに取っておく(ここがJSR252クオリティ)
    • 出来上がったUIComponentのツリーを描画、出力する
    • フォームの情報が送られてきたらそれぞれ対応するUIComponentに反映
    • そのUIComponentとDTOが式でバインディングされているので、DTOの値が変わる
  • Tapestry
    • 初めてのアクセス時、特に難しいことなく描画
    • フォームの情報が送られてきたら、まず一度目に空描画(rewindという)
    • 画面を構成するコンポーネントにrewindモードの時の動作が実装されていて、フォーム情報をコンポーネントが自律的に取り込む
    • OGNLを通して、DTOの値が変わる
    • 二度目描画として特に難しいことなく描画。

JSR252およびTapestryがそれぞれ工夫しているのは、画面にループがあり、それとフォームが組み合わされた場合のことを考えてのことです。このへん、もっとうまくならないものかなと。JSR252では毎度巨大にもなりうるコンポーネントツリーを作っちゃうし、Tapestryは二度描画という奇想天外な技を使えるのもWEBテンプレとWEBミドルをセットにしているからなんですが。。。ということで、Ikushipeのアーキテクチャでは以下のように考察。

  • JSR252のUIComponentのツリーを作るみたいな動きはどうも痛い。ひがさんが何か考えているみたいなので、これの破壊的ソリューションをTeedaに期待。が、私には思いもよらん。
  • Tapestryの2度書きを、WEBミドルのみでやる方法を考えてみる。JSR252でのViewHandlerでJSPエンジンをHttpServletResponseをラップして出力を食ってるようにして、2度書きをやるか(念のため。JSR252はJSPは1度書きです)?
  • ループのコンポーネントを細工して、パラメータにインデックス情報を埋め込んでみる(これがIkushipeのこれまでのバージョン)

Tapestryライクな2度書きかな。。。これの欠点はコンポーネントに難しさが行って、量産が効かなくなるのですが。。。ClickやStripesなど最近のものは見れてないので、参考に研究してみたいとも思ってます。
追記
もう一個。

  • JSR252風のバリエーション
    • JSR252風に初回描画時にサーバ上にUIComponentみたいなもののツリーを作る。
    • けどツリーに作るのはDTOとバインドしたフォーム関連のもの&ループ情報だけ。
    • UIComponentみたいなものは値のやり取りだけで、描画は受け持たない。
    • フォーム入力が送信されてきたら、ツリーを通して値反映を行う。
    • 普通に描画する。

2度書きよりはこっちがよさそう。。。