Struts2 ベストプラクティス

提供: tknotebook
2017年2月26日 (日) 12:42時点におけるNakamuri (トーク | 投稿記録)による版

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索

メインページ>コンピュータの部屋#Java>Struts2 Tips


私なりにまとめたベストプラクティスです。

JSPを曝さない

セキュリティを堅くするため、JSPは WEB-INF 内に置き、ブラウザから直接アクセスできないようにします。 つまり、JSP はアクションのDispatch 型のResult として呼び出すようにすることを推奨します。

直接 JSP をブラウザから読めるようにすると、書き方の選択肢が多すぎて混乱しますし、 常にアクションから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 の定義をそれぞれ別の画面のグループに割り付けたくなることが多々あります。

例えば

  1. グループA: どんな状況でも表示できる画面のグループ
  2. グループB: ログイン中に表示できるグループ
  3. グループC: 管理者がログイン中であるときのみ表示できるグループ

このような画面のグループはインターセプターの設定や global-result の設定などがグループ毎に異なります。 このような設定を画面ごとに別々に行うのは大変なので、設定を struts.xml にまとめて 幾種類か package の形で書いておき、それを画面で「継承」して使うのが楽です。

struts2 では Java の package の package-info.java に @ParentPackage アノテーションで付けることで、Javaのあるパッケージ、およびそのサブパッケージ全体に struts.xml 内で定義した パッケージ(Javaのパッケージではなく、Actionの設定をグループ化するパッケージ) を継承させることができます。

画面の種類ごとにstruts.xml 内で定義した 異なるpackage を継承する場合、アクションクラスの所属する java package を分けると package-info.java に @ParentPackage アノテーションをつけるだけで、グループ内の全画面のアクションに、struts.xml のpackageの設定をまとめて適用できるのでとても便利です。

バリデーションなしのメソッドはアノテーションで指定する

バリデーションの設定のある画面では、最初にバリデーションなしで画面を表示する必要があります。また、入力を捨て、バリデーション無しで画面遷移したいときもあります。

バリデーションを行わずにアクションを実行する場合、アクションは既定では、アクションクラスの input、 browse、cancel、back メソッドに割り付けることになっていますが、他の名を使いたいことが多いと思います。

バリデーションの抑止はメソッド名に頼らず @SkipValidation アノテーションを使うことをお勧めします。

同じ内容のJSPは struts2 の includeタグで複製して作る

結果を表示する JSP は、表示する内容は全く同じでも、Conventionプラグインによる命名が異なるファイル名になってしまうことがあります。この時は struts2 の includeタグ で中身を同じにしてしまうことを推奨します。

鋭意 追加中!