「Struts2 ベストプラクティス」の版間の差分

提供: tknotebook
移動: 案内検索
(一アクションクラス=一画面=一個以上のアクション)
 
(1人の利用者による、間の22版が非表示)
5行: 5行:
 
私なりにまとめたベストプラクティスです。
 
私なりにまとめたベストプラクティスです。
  
;Conventionプラグインを入れてアノテーションを使う。
+
==JSPを曝さない==
:struts.xml で設定を行うより、Conventionプラグインを入れてアノテーションで設定を書く方が楽です。
+
  
;Conventionプラグインを入れて既定の jspファイル名を使う
+
セキュリティを堅くするため、JSPは WEB-INF 内に置き、ブラウザから直接アクセスできないようにします。
:Conventionプラグインを入れると、アクション処理後の ビューのファイル名は jsp の場合 /WEB-INF/content/<ネームスペース>/<アクション名>-<戻り値>.jsp になります。JSPを呼び出すだけの場合は Resultアノテーションを使わず、このConventionを利用することをお勧めします。
+
つまり、JSP はアクションのDispatch 型のResult として呼び出すようにすることを推奨します。
  
;1アクションクラス=1画面=1個以上のアクション
+
直接 JSP をブラウザから読めるようにすると、書き方の選択肢が多すぎて混乱しますし、
:struts2は1アクションクラス=1アクションが基本ですがクラスが増えすぎます。アノテーションを使って1アクションクラス=1画面=1個以上のアクション という対応にすることをお勧めします。
+
常にアクションからJSPへフォワードするようにすると、JSP のレンダリングが常にアクションの影響下にあるので、
 +
より臨機応変な対応が可能になります。
  
;画面毎にネームスペースを分ける
+
==Conventionプラグインを入れてアノテーションを使う==
:画面=アクションクラス毎にネームスペースを別にすると、各画面で同じアクション名が使えて便利です。
+
アクションの設定を全て struts.xml で行うより、Conventionプラグインを入れてアノテーションで設定を書く方が楽です。
  
;画面の種類毎に java のパッケージを分ける
+
但し、複数のアクションや複数の画面に共通の設定は struts.xml に書くべし。
:struts2 では package-info.java に @ParentPackage アノテーションで付けることで、Javaのあるパッケージ、およびそのサブパッケージ全体に struts.xml 内で定義した package を継承することができます。画面の種類ごとに画面がstruts.xml 内で定義した 異なるpackage を継承する場合、アクションクラスの所属する java package を分けると便利です。
+
  
;バリデーションなしのメソッドはアノテーションで
+
==Conventionプラグインを入れて既定の jspファイル名を使う==
:バリデーションの設定のある画面でバリデーションを行わずに画面を表示する場合、アクションは input や browse 等を使うことになっていますが、私は初期表示は showアクションに決めています。バリデーションの抑止は @SkipValidation アノテーションを使います。
+
  
;同じ内容で複数のJSPは s:includeタグを使う
+
コンベンションプラグインを入れると、アクション実行後、既定で
:結果を表示する JSP は、表示する内容は全く同じでも、Conventionプラグインによる命名では異なるファイル名になってしまうことがあります。この時は s:includeタグ で中身を同じにしてしまうことを推奨します。
+
 
 +
/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 内で定義した パッケージ(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タグ で中身を同じにしてしまうことを推奨します。
 +
 
 +
'''''鋭意 追加中!'''''

2017年2月26日 (日) 12:42時点における最新版

メインページ>コンピュータの部屋#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タグ で中身を同じにしてしまうことを推奨します。

鋭意 追加中!