最近使っているのは、S2Struts1.3系。
今まで長らくS2JSFを使ってきたので、
S2StrutsのActionForm辺りの扱いに、ちょっと戸惑ってます。
一番困ったのが、ActionFormに初期値を入れたい場合。
リンクやリダイレクトでHTMLに飛んできた場合、
<s2struts:init>タグで、InitAction#initializeを呼び出しても
InitActionにはActionFormがバインドされません(よね?)
# もちろん、前ページのActionでActionFormを作っておいて、
# フォワードで飛んでくれば、問題なくバインドされますが。
ActionFormのクラス名前をXxxDtoとして、
AutoRegisterでS2コンテナに登録しておけば
InitActionにDtoはバインドされますが、ここでDtoに値を設定しても
描画されるHTMLには反映されませんでした。
どうやら、画面描画時には
改めてActionFormとしてDtoのインスタンスが作り直される模様。
どうしようもないのかなー、と思ったのですが、
苦肉の策で、こんな事をしてみました。
まずはMayaa側。
<m:doRender id="appBody" name="content"> <s2struts:init action="#{xxxEditAction.initialize}" /> <m:doBody/> </m:doRender> <html:form m:id="xxxForm" action="/xxxEdit" method="POST"> <m:exec script="${ xxxEditAction.initForm(xxxForm.instance); }" /> <html:hidden name="xxxForm" property="xxxId" /> <s2struts:page /> <m:doBody/> </html:form>
このように、initializeとformの初期化メソッドを分けて記述します。
そしてAction側。
public void initialize() { // 初期化処理 } public void initForm(XxxForm xxxForm) { xxxForm.setXxxId(111); }
こちらも、それぞれメソッドを作っておきます。
こうすれば、一応、初期化に成功して、
HTML側に <input type="hidden" name="xxxId" value="111"> が書き出されました。
# もちろん実際は、initFormの中で、初期化が必要な状況かどうかの
# 判定をしてから、値の代入を行いますが。
でも、ホントにこんな風に書かなきゃいけないのでしょうか?
何か記述ミスがあって、initializeのタイミングでActionFormが
バインドされないだけじゃないかなー、とも思っています。
どなたか、もっとスッキリと書ける方法があれば、教えてください m(_ _)m
2007/5/28追記 InitActionクラスにActionFormのsetter/getterを書いておいて、 initializeメソッドの中でActionFormがnullならnewして初期化処理を行なう、 という方法を教えて頂きました。 Actionのgetterを記述しておくと、 1. ActionFormの場合は、ActionFormとしてStrutsがに管理される。 2. ActionFormでない場合は、適宜、request/sessionに保持される。 という処理になるようです。 kanagさん、ありがとうございました。