ひがやすを技術ブログ

電通国際情報サービスのプログラマ

Super Agile Struts開発記その7 - ActionFormの分離

SAStrutsでは、ActionとActionFormは、基本的に同じクラスで実装しますが、複数のActionで同じActionFormを共有したくなることもあるでしょう。
その場合、ActionFormをPOJODTOで作成し、Actionのプロパティに@ActionFormアノテーションをつけます。


public class HogeAction {
@ActionForm
public HogeDto hogeDto;
...
}
複数のActionで一つのActionFormを共有するとき、ActionFormはセッションにおきたいことが多いはずです。その場合は、DTOに@Componenent(instance=InstanceType.SESSION)と指定します。この辺の機能は、SAStrutsではなく、Seasar2の機能です。

@Componenent(instance = InstanceType.SESSION)
public class HogeDto {
...
}
追記:http://d.hatena.ne.jp/higayasuo/20071204#c1196772533に対するコメント。

例えばユースケース(サブ機能?)において、
共通のフォームが多数存在するような場合は、
TeedaのPageクラスのように継承を用いることも
物理的には可能(親クラスにpublicフィールド)かと思うのですが、
そのようなアプローチは推奨しない方針でしょうか??
個人的にはDTOに切り出した方がわかりやすい
Strutsっぽい)のですが、
ひがさんの御意見を聞いてみたいなぁとw

その場合はそれぞれの子アクションでスコープを指定
(InstanceType.SESSION)?

Actionは、振る舞いが中心で、必要ならパラメータも受け取ることができるだけなので、セッションに置くのは、役割が違う気がします。
後、ActionにはAOPをかけることが十分考えられますが、Seasar2的には、AOPのかかったオブジェクトをセッションにおくことができません。