9
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Actionクラスに付与するインタフェースと機能

Posted at

Struts2のActionクラスに拡張できる機能

Struts2のActionクラスに対して、あらかじめ用意されたインタフェースを実装することで、機能の拡張ができます。

例えばActionクラスでHttpSessionに格納されるオブジェクトを扱いたい場合には、SessionAwareを実装し、インタフェースが提供するメソッドとフィールドを実装するだけです。

このように、ActionクラスのフィールドとしてActionクラスが扱えるオブジェクトを追加することや、Actionクラスの実行前に書きたい処理がある場合に実装するインタフェースなどが用意されています。

簡単に言うと、
~Aware = Struts2が機能拡張を「気づく(Aware)」Actionである
ですね。

使い方

次の例は、先ほどあげたSessionAwareの実装例です。

SessionSampleAction.java
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;
}

手順は次のとおりです。

  1. Actionクラスにて、implements SessionAware を宣言
  2. 実装メソッドである setSession(Map session)にて、ActionのフィールドへHttpSessionのオブジェクトを格納する処理を実装する。this.session = session; でほぼ十分。
  3. 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クラスにて実装しておいて、さらにいくつか必要なパターンの数を用意して、実装時にはそれを利用する規約なりお手本を提供するのがよいでしょう。

9
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?