Struts2 ベストプラクティス
メインページ>コンピュータの部屋#Java>Struts2 Tips
私なりにまとめたベストプラクティスです。
目次
JSPを曝さない
セキュリティを堅くするため、JSPは WEB-INF 内に置き、ブラウザから直接アクセスできないようにします。 つまり、JSP はアクションのDispatch 型のResut として呼び出すようにすることを推奨します。
直接 JSP をブラウザから読めるようにすると、書き方の選択肢が多すぎて混乱しますし、 JSP のレンダリングが常にアクションの影響下にあるので、修正がやりやすいです。
Conventionプラグインを入れてアノテーションを使う
アクションの設定を全て struts.xml で設定を行うより、Conventionプラグインを入れてアノテーションで設定を書く方が楽です。
但し、複数のアクションや複数の画面に共通の設定は struts.xml に書くしかないです。
Conventionプラグインを入れて既定の jspファイル名を使う
コンベンションプラグインを入れると、アクション実行後、既定で
/WEB-INF/content/<ネームスペース>/<アクション名>-<戻り値>.XXX(JSPなど)
にフォワード(Dispatch)されます。リダイレクトやチェーンなどをせず、JSP等を呼び出すだけの場合は @Resultアノテーションを使わず、コンベンションプラグインが決めてくれるビュー名を使うことをお勧めします。
こうするとアノテーションが簡潔になります。
一アクションクラス=一画面=一個以上のアクション
struts2は一アクションクラス=一アクションが基本ですが、フォームに複数のボタンがある場合クラスが増えすぎます。 アノテーションを使って一アクションクラス=一画面=一個以上のアクション という対応にすることをお勧めします。 アクションはクラスではなくメソッドに割り付けます。
画面毎(アクションクラス毎)にネームスペースを分ける
アクションのURL は
<コンテキストパス><アクションクラスに割り付けたネームスペース>/<アクション名>.action
とすることを強く推奨します。こうするとクラス間でアクション名が重複しても問題ありません。
アクションクラス毎に @Namespaceアノテーションを使うことを推奨します。
画面の種類毎に java のパッケージを分ける
strutsでは struts.xml で定義した複数の package の定義をそれぞれ別の画面のグループに割り付けたくなることが多々あります。
例えば
- グループA: どんな状況でも表示できる画面のグループ
- グループB: ログイン中に表示できるグループ
- グループC: 管理者がログイン中であるときのみ表示できるグループ
このような画面のグループはインターセプターの設定や global-result の設定などがグループ毎に異なります。 このような設定を画面ごとに別々に行うのは大変なので、設定を struts.xml にまとめて 幾種類か package の形で書いておき、それを画面で「継承」して使うのが楽です。
struts2 では Java の package の package-info.java に @ParentPackage アノテーションで付けることで、Javaのあるパッケージ、およびそのサブパッケージ全体に struts.xml 内で定義した package を継承させることができます。
画面の種類ごとにstruts.xml 内で定義した 異なるpackage を継承する場合、アクションクラスの所属する java package を分けると package-info.java に @ParentPackage アノテーションをつけるだけで、グループ内の全画面のアクションに、struts.xml のpackageの設定をまとめて適用できるのでとても便利です。
バリデーションなしのメソッドはアノテーションで指定する
バリデーションの設定のある画面では、最初にバリデーションなしで画面を表示する必要があります。 バリデーションを行わずに画面を表示する場合、アクションは既定ではアクションクラスの input や browse メソッド等、 決まった名前のメソッドを使うことになっていますが、私は初期表示は showアクションに決めています。 バリデーションの抑止は @SkipValidation アノテーションを使います。
同じ内容のJSPは struts2 の includeタグで複製して作る
- 結果を表示する JSP は、表示する内容は全く同じでも、Conventionプラグインによる命名が異なるファイル名になってしまうことがあります。この時は struts2 の includeタグ で中身を同じにしてしまうことを推奨します。
鋭意 追加中!