Strutsを使用する際に用いるPRGパターン
最近仕事でStrutsを使ってるプロジェクトに飛び入りで入ったのだけど、 これが結構設定ファイルやらなにやらがグチャグチャ。
そんなにStrutsを使ってない私でさえも思うのだから結構ひどい気がする。
そこで以下のようなメールを開発者MLに投げてみた。
なんかこんな偉そうなメール書いてさらに間違ってたらどうしようかとちょっと気になったのだけど、まあとりあえずどんなことでもトライアンドエラーで!
Strutsの設定ファイルやActionの周りをみてて思ったことなのですが、 Struts関連の設定やクラスの使い方に関して、 コーディング規約などがちゃんと決まってないように思えます。
まあコーディング規約とかいう堅苦しい文書がなくても良いとは思うのですが、 少なくとも、もうすこしシンプルにStrutsを使えると思えるので、 以下TIPSです。
- 表示画面一つに対して1Actionを定義する。
便宜的にこれをViewActionとよびます。 これは具体的に言うとJSP一つに対してstruts-config.xmlの<action/>を、 一つ定義すると言うことです。 また、そのJSP内で使用するはずのActionFormやJavaBeansは基本的に、 すべて表示用のActionクラスで生成しrequestにセットします。
- 1ロジックに対して1Actionを定義する。
これはJSPをもってないActionです。 便宜的にLogicActionとよぶとすると、 LogicActionは処理のみを担当するActionです。 1のViewActionは基本的にLogicはまったく担当しません。
- LogicActionはViewActionにリダイレクトする。
LogicActionはViewを持たないのでViewActionにリダイレクトします。 LogicActionはViewに関連するJavaBeansやActionFormを基本的に生成しません。
- 処理の流れ
入力フォームのあるViewAction→LogicAction→結果を表示するViewAction
入力フォームのあるViewActionと結果を表示するViewActionは、 同一のActionでもかまいませんが意識的に分離して考えるべきです。
メリットはViewActionやLogicActionの使い回しがかなり楽になることです。 DispatchActionを使用するときはDispatchActionはActionをDispatchするだけに とどめ、 場合に分けてこれらのViewActionやLogicActionを呼び出すと良いでしょう。
さらにStrutsを上手に使うためには以下のURLを参考にするとよさそうです。 これ読んだときは目から鱗でした。
http://d.hatena.ne.jp/winebarrel/20050616#p5
んで、上の文章の肝が、LogicActionからViewActionへの遷移にリダイレクトを用いる、というところなのですが、これはPRG(Post Redirect Get)パターンと呼ばれるものらしい。
JavaWorld Onlineの記事、"「OzStruts」でページ・ドリブン開発を行う"にも書いてあるのですが、このPRGパターンはそもそもHTTPフォームのダブル・サブミット(Webブラウザの「戻る」ボタンや「更新」ボタンによる意図しないサブミット)対策なのだが、このパターンを使用すると、リクエストの処理と表示の準備が完全に分離される。
というわけで、パターン名もちゃんとあったことだし、これからこのパターンを使うようにしましょうかね!