Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

Strutsベストプラクティス

jax magazineにあった記事を翻訳。


Use intermediate Action class for common operations
中間のアクションクラスを追加し他のすべてのアクションクラスにそれを継承させることで、
共通の操作の処理を集中させとコードの冗長度を低下させる。


Handle duplicate form submission
レスポンスが返ってくる前にユーザがサブミットボタンを1回より多くクリックした時に、
またはクライアントが以前ブックマークしたページの戻ってビューにアクセスした時に発生する。
これは結果として矛盾したトランザクションとなるかもしれないし、避けなければならない。


Use Application Modules for parallel development
複数のモジュールがある大規模プロジェクトでは、異なる開発者たちの間で同じStruts設定ファイルを共有することは問題になる。
Strutsは複数のモジュールに分割するためのアプリケーションモジュールを提供している。


Use single ActionForm for similar forms
似たフォームには、いくつものアクションフォームの代わりに
すべての予定されるフィールドを含む1つのアクションフォームを使用する。
これは通常同じユースケースを実装する必要がある異なるフォームに適用する。
すべてのフィールドがすべてのアクションで使用されるわけではないが、
これはメンテナンスの簡単さにつながる。


Use global-forwards to avoid redundant forwards
この要素はモジュールでの複数のアクションで使用するフォワードを設定できる。


Use Struts exception handler for generic exceptions
org.apache.struts.action.ExceptionHandlerを継承した新しい例外を作成する。
executeメソッドをオーバーライドする。
struts-config.xmlに記入する。


Remove ActionForm from session
もしアクションフォームがセッションスコープにセットされたなら、
その役目が終わったときはいつであろうとセッションからそれを削除すべきだ。


Use Business Delegate
アクションは複雑なビジネス機能を実装してはいけない。
むしろこれらをモデルに委譲すべきだ。
ビジネスデリゲートをビジネス層とデータ層にデータを送信するために使う。


Use ForwardAction for simple JSPs
JSPに飛ばす以外にアクションに要求されるロジックがない場合にForwardActionを使う。


Avoid using instance/static variable in Action class
インスタンスとstatic変数は特定のリクエストの状態に関連した情報を保持するためにアクションクラスで使用しないべきだ。
アクションクラスの同じインスタンスはマルチスレッドを通じて同時リクエストで共有される。
だからあらゆるインスタンス/static変数はあらゆるスレッドで不意に更新されるかもしれない。
このバグは再現することが難しいので、最初の時点でそれを防ぐことが一番よい。
しかしながら、インスタンス/static変数は同じアクションのためのリクエストをまたいだ
グローバルなリソースを共有するためには使用してよい。


ActionForms are not Model
アクションフォームはHTMLフォームを表現し、ビューとコントローラー間でデータを
移動させるためにStrutsによって使用される。
モデルの一部として捉えてはならない。
それゆえにアクションフォームのreset()やvalidate()メソッドに
あらゆるビジネス機能を含んではならない。
これはプレゼンテーション層とアプリケーションのビジネス機能の密結合を導く。


Use html:messages instead of html:errors
エンドユーザにエラーメッセージを表示するために、html:errorsの代わりにhtml:messagesを使用する。
html:messagesはリソースバンドルの外からマークアップ言語を取得できる。


Use Tools
Easy Struts, Struts Console, Struts Builderなど。


Use StrutsTestCase for unit testing
StrutsTestCaseはStrutsフレームワークをベースとするテストコードの機能を提供する標準のJUnit TestCaseクラスの拡張だ。
StrutsTestCaseはActionServletコントローラをコードをテストするために使用するので、
Actionオブジェクトの実装だけをテストするのではなく、マッピング、フォームbean、フォワード宣言もテストできる。
さらに、StrutsTestCaseはvalidationメソッドも提供するのでユニットテストケースを速く簡単に書くことができる。