3
6

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.

Struts2におけるリクエストパラメータの扱い(中級)~ScopedModelDriven

Posted at

ScopedModelDrivenとは

ScopedModelDrivenはActionクラスを拡張するStruts2標準インタフェースの1つです。これを使うことで、リクエストパラメータの内容をActionクラス自身ではなく、Actionクラスが持つ別のクラスへ格納します。

利用法

使うためには、Actionクラスに以下の実装をするだけです。

  • ActionクラスにScopedModelDrivenインタフェースを実装する
  • ScopedModelDrivenのメソッドを実装する
  • Actionクラスのフィールドに、ScopedModelDrivenのメソッドの内容を格納する

言葉で書くとわかりにくいので、実際に実装した例を示します。

ScopeSampleAction.java
public class ScopeSampleAction extends ActionSupport implements ScopedModelDriven<User> {

	@Getter @Setter
	private User model;

	@Getter @Setter
	private String scopeKey;
}

ScopedModelDrivenでは、modelとscopeKeyのset/getメソッドを実装します。modelはリクエストパラメータを格納するクラス、scopeKeyは後述するScopeへ格納する時の名称です。

こうすることで、HTMLの送信パラメータを修正せずに、直接modelへ値の格納を行います。

Scopeについて

ScopeはJavaのWebアプリケーションスコープと同じスコープが使えます。ScopedModelDrivenでは、ServletRequest属性ないしはHttpSession属性のどちらかです。デフォルトはServletRequest属性です。

scopeKeyの値はHttpSession属性へ格納するときの名前で、Struts2の内部で自動的に生成した値が入ります。

HttpSession利用の設定方法

ScopedModelDrivenの動作はStruts2の標準機能として有効になっています。HttpSessionの利用、つまりScopedModelDrivenで扱うクラスをセッションへ格納するには、ScopedModelDrivenの設定を変更します。

以下の例は、標準のインターセプタ設定に、ScopedModelDrivenの設定を変更する例です。

ScopeSampleAction.java
@InterceptorRefs(
		value = {
				@InterceptorRef(value="defaultStack" , params={"scopedModelDriven.scope","session"}) ,
		}
)
public class ScopeSampleAction extends ActionSupport implements ScopedModelDriven<User> {

	@Action("scope")
	public String start() throws Exception {

		if ( model == null ) {
			model = new User();
		}

		return SUCCESS;
	}

	@Getter @Setter
	private User model;

	@Getter @Setter
	private String scopeKey;
}

@InterceptorRefs,@InterceptorRefはStruts2のAction実行前後に動くインターセプタと呼ばれる、フィルタリング機能を設定するアノテーションです。
ScopedModelDrivenは、scopedModelDrivenの名前で struts-default.xmlで定義済みなため、params属性にて指定します。

設定の書き方は、

params={"設定名","設定値" , "設定名","設定値" , …(以後繰り返し)… } 

となります。

設定名については設定の階層構造に沿って定義できるようになっています。今回はScopedModelDrivenのscope値を変更するため、scopedModelDriven.scope が設定値となります。

このインターセプタ設定については高度な設定方法となりますので、また別途。

3
6
0

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
3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?