Struts2のActionクラスに拡張できる機能
Struts2のActionクラスに対して、あらかじめ用意されたインタフェースを実装することで、機能の拡張ができます。
例えばActionクラスでHttpSessionに格納されるオブジェクトを扱いたい場合には、SessionAwareを実装し、インタフェースが提供するメソッドとフィールドを実装するだけです。
このように、ActionクラスのフィールドとしてActionクラスが扱えるオブジェクトを追加することや、Actionクラスの実行前に書きたい処理がある場合に実装するインタフェースなどが用意されています。
簡単に言うと、
~Aware = Struts2が機能拡張を「気づく(Aware)」Actionである
ですね。
使い方
次の例は、先ほどあげたSessionAwareの実装例です。
package sample.action;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
/**
* @author A-pZ
*
*/
public class SessionSampleAction extends ActionSupport implements SessionAware {
/**
* @see org.apache.struts2.interceptor.SessionAware#setSession(java.util.Map)
*/
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
private Map<String, Object> session;
}
手順は次のとおりです。
- Actionクラスにて、implements SessionAware を宣言
- 実装メソッドである setSession(Map session)にて、ActionのフィールドへHttpSessionのオブジェクトを格納する処理を実装する。this.session = session; でほぼ十分。
- 2.の手順で実装したフィールドを用意する
これにより、このActionクラスのsessionフィールドへ、Struts2が自動的にHttpSessionの内容をMapの型で格納します。
このMapの内容を更新すれば即時にHttpSessionへ格納され、Mapから削除をすればHttpSessionから削除されます。
その他の拡張インタフェースと機能
他にもいくつか便利なインタフェースがあります。標準で継承が推奨されているActionSupportクラスが標準で搭載している機能もありますので合わせて紹介します。
中にはAwareがついていないものもありますが、これは標準機能としてStruts2のActionクラスが利用している webwork2時代のインタフェースです。
Awareインタフェース名 | 機能の概要 | ActionSupportで搭載済 |
---|---|---|
ValidationAware | Actionクラスで格納するメッセージ、エラーメッセージ、Validationで検出したエラーをactionMessages、actionErrors、fieldErrorsに格納する | ○ |
Validateable | Validationを有効にする | ○ |
TextProvider | メッセージ定義プロパティからテキストを取得する | ○ |
LocaleProvider | Actionクラスからリクエストのロケールを取得する | ○ |
ApplicationAware | サーブレットコンテキスト(アプリケーション属性)をMap<String,Object>で取得する | - |
ParameterAware | サーブレットが受け取ったリクエストパラメータをMap<String,String[]>で取得する。Actionクラス内でリクエストパラメータの内容を増減させるために扱う特殊な機能 | - |
PrincipalAware | 認証情報を扱うPrincipalを、PrincipalProxyの型で取得する | - |
RequestAware | サーブレットリクエスト属性をMap<String,Object>で取得する | - |
ServletRequestAware | HttpServletRequestオブジェクトを取得する。濫用に注意。 | - |
ServletResponseAware | HttpServletResponseオブジェクトを取得する。あらたなレスポンス形式で出力する場合に扱う。 | - |
SessionAware | セッション属性をMap<String,Object>で取得する | - |
アプリケーションを作る時のコツとして
これらを逐一ActionSupport implements ~Aware , ~Aware , ~Aware とするのも良いですが、そのアプリケーションで頻出する機能については、拡張Actionクラスにて実装しておいて、さらにいくつか必要なパターンの数を用意して、実装時にはそれを利用する規約なりお手本を提供するのがよいでしょう。