ScopedModelDrivenとは
ScopedModelDrivenはActionクラスを拡張するStruts2標準インタフェースの1つです。これを使うことで、リクエストパラメータの内容をActionクラス自身ではなく、Actionクラスが持つ別のクラスへ格納します。
利用法
使うためには、Actionクラスに以下の実装をするだけです。
- ActionクラスにScopedModelDrivenインタフェースを実装する
- ScopedModelDrivenのメソッドを実装する
- Actionクラスのフィールドに、ScopedModelDrivenのメソッドの内容を格納する
言葉で書くとわかりにくいので、実際に実装した例を示します。
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の設定を変更する例です。
@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 が設定値となります。
このインターセプタ設定については高度な設定方法となりますので、また別途。