ActionFormについて思うこと

先々週辺りに発覚したActionのpublicフィールドの予期せぬ自動バインドの問題。→参照:ぱる日記


これを受けて次のリリースからはActionFormの使用を推奨するようで、それに伴ってか、ActionForm周りで色々と動きがありそうです。


私はActionFormとしてのDtoを必ず作成する方針とし、一律セッションスコープで使っているので、セッションスコープのActionFormの削除手段が用意されたのは嬉しいのですが、私の抱える問題を解決できる手段ではなさそうです。

私のActionFormの使い方と抱える問題

先に述べたとおり、私はActionFormを必ず作成し、一律セッションスコープで使っています。

また、1つのActionの中に検索処理や編集処理などを含めているので、ActionFormには検索系の項目と登録系の項目が混在しています。

セッションスコープで使っている理由としては、

      • 登録処理に確認画面を挟むため
      • 検索画面と一覧画面が別画面で、一覧画面ではページングの機能が必要なため

といった理由からです。id:cypher256さんのSAStruts関連のエントリーの影響も大きいのですが。。


ここで問題になるのは、検索系の項目と登録系の項目のリセットタイミングが違うことです。
私は、この対処として同じくcypher256さんの@Reset アノテーション - cypher256's blogで書かれている@Resetアノテーションを流用させて頂いて凌いでいます。


今回、SAStrutsで用意されるセッションスコープのActionFormの削除手段(@ExecuteアノテーションにremoveActionForm=trueを指定)は、実行メソッドの正常終了時にセッションからそのActionFormを削除するというものなので、検索系の項目だけ初期化、登録系の項目だけ初期化といったことができそうに無いです。

ActionとActionFormは1:1の関係が良いのか?

登録処理系と検索処理系をxxxActionとxxxSearchActionと分けてActionFormも別にしてしまえば良いのですが、それに伴ってURLもxxx/editとxxxSearch/searchと変わってしまうのも、なんか嫌ですよね。

現状、SAStrutsアーキテクチャとしてはActionとActionFormは1:1の関係となっていますが、個人的にはActionとActionFormは1:nの関係で、Actionの実行メソッドで使用するActionFormを選べたほうが柔軟で良いのではないかと最近考えるようになってきました。

@Executeアノテーションで使用するActionFormを選択できて、removeActionForm=true指定をしておけば実行メソッドの正常終了時にそのActionFormがセッションから削除されるという様になれば、検索系のActionFormと登録系のActionFormのリセットタイミングを変えられるので良いなぁ、と。


この辺りの問題は皆さんはどのように対処しているんでしょうか?

ActionFormセッションスコープ派な人や、別な解法をお持ちの方はご意見戴けるとありがたいです。