谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

ActionFormの初期化方法

最近使っているのは、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さん、ありがとうございました。