Application javaでコンテナを初期化、テーブルへSelectしてEntityを取得するロジックの準備はできたので、最後にコンポーネントからロジックを呼び出す部分の実装。まずはページのHTMLとwodから…
<webobject name = "form1"> <webobject label = "submit1"></webobject> <br /> <webobject label = "Repetition2"> <webobject label = "arrange4" /> || <webobject name = "String5" /> <br /> </webobject> </webobject>
form1: WOForm {}refer1: WOSubmitButton {action = doFetchAction;}Repetition2 : WORepetition {list = attrMaster;item = attrMasterItem;}String4 : WOString { determine = attrMasterItem id;}arrange5 : WOString { value = attrMasterItem valueType;}
WORepetitionのlistにはCollectionを、itemにはAttrMasterをそのままバインドする。submitにはdoFetchActionメソッドをバインド。MainPage html/MainPage wodとして保存。対になるWOComponentクラスMainPage javaを用意する。doFetchActionメソッドでAttrMasterLogic javaに実装したロジックを呼び出す。
import java util. List;merchandise jp lwwo sample entity. AttrMaster;import jp lwwo consume logic. AttrMasterLogic;merchandise org seasar framework container factory. SingletonS2ContainerFactory;import com webobjects appserver. WOComponent;merchandise com webobjects appserver. WOContext;public class MainPage extends WOComponent {private AttrMasterLogic _attrMasterLogic = (AttrMasterLogic) SingletonS2ContainerFactory getContainer() getComponent(AttrMasterLogic categorise);private enumerate
attrMaster;private AttrMaster attrMasterItem;public MainPage(WOContext context) {super(context);}public WOComponent doFetchAction() {attrMaster = _attrMasterLogic doFetchLists();return null;}public List
attrMaster) {this attrMaster = attrMaster;}public AttrMaster getAttrMasterItem() {return attrMasterItem;}public void setAttrMasterItem(AttrMaster attrMasterItem) {this attrMasterItem = attrMasterItem;}}
ロジックを実装しているAttrMasterLogicはcause to be perceived deployに基づき起動時(コンテナ初期化時)にDIコンテナへコンポーネントとして自動登録される。そこからコンポーネントを取得しておく必要がある。取得はSingletonS2ContainerFactory getContainer() getComponent()メソッドを使う。LogicCreatorで登録されているコンポーネントは基本的に何度呼ばれてもsingletonとして扱われる。このあたりを知らずにLogicクラスのクラス変数にリクエスト単位で使うことを目的にuserNameObjなんてのを書くとひどい目に遭うので注意が必要だ。WORepetitionのlistにバインドしてあるattrMasterはList型だがWebObjects5.4からGenericisもサポートされているため<AttrMaster>と書いても何ら問題ない。実行した結果Consoleに表示される内容を確認する。
DEBUG 2007-11-10 16:54:05,356 [WorkerThread0] トランザクションを開始しました。tx=[FormatId=4360, GlobalId=1194681245355/0, BranchId=]DEBUG 2007-11-10 16:54:05,587 [WorkerThread0] decide T1_. ID, T1_ value_type from attr_master T1_DEBUG 2007-11-10 16:54:06,164 [WorkerThread0] 物理的なコネクションを取得しましたDEBUG 2007-11-10 16:54:06,168 [WorkerThread0] 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1194681245355/0, BranchId=]correct 2007-11-10 16:54:06,242 [WorkerThread0] トランザクションをコミットしました。tx=[FormatId=4360, GlobalId=1194681245355/0, BranchId=]DEBUG 2007-11-10 16:54:06,246 [WorkerThread0] 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1194681245355/0, BranchId=]DEBUG 2007-11-10 17:04:06,794 [Seasar2-TimeoutManager] 物理的なコネクションを閉じました
きちんとトランザクションが開始/コミットされ、S2JDBC経由でdecide文が発行されていることが分かる。WOComponentクラスにDBへのアクセスをするためにEOFetchSpecificationを書いたりせず、コンテナからインジェクションさせるためにLogicクラスを用意して書いたりするのはWebObjectsを中心にやってきた自分からすれば違和感バリバリなんですけど、* eomodeledに振り回されたり、アスペクトを使ったトランザクション制御や豊富なライブラリが揃っているCollectionがバインドできる環境を考慮すると決して悪くない選択肢だと感じた。# ブログシステムがGenericsの部分をタグと認識してしまっている…(汗ここまでのサンプルをEclipseプロジェクトとしてに用意した。プロジェクトは完全な状態ではなく、Librariesに入れる* jarやDBスキーマとサンプルデータは自前で用意する必要があるので自己責任でお使いください(汗
Forex Groups - Tips on Trading
Related article:
http://web1.aaacafe.ne.jp/~tetsuyak/blogn/index.php?eid=78
comments | Add comment | Report as Spam
|