(2) ScopedModelDrivenInterceptor
ScopedModelDrivenを実装することで、設定したスコープ(コンテキスト、セッション、リクエスト)にてmodelインスタンスを扱い、setModel()にて実装した内容からインスタンスを取得することができます。ModelDrivenInterceptorと類似していますが、必須となるフィールド、メソッド、ならびに設定しなければならない項目が異なります。Actionクラスのサンプルを以下に示します。
/**
* ScopedModelDriven実装=implements ScopedModelDriven<モデルクラス>…(A)
*/
public class ScopedModelDrivenSample extends ActionSupport implements ScopedModelDriven<ModelDrivenSample> {
private static Logger log = Logger.getLogger(ScopedModelDrivenSample.class);
@Action(value="start")
public String start() throws Exception {
return "success";
}
@Action(
value="execute" ,
interceptorRefs= {
// ScopedModelDriven設定をscopedModelDriven.パラメータ名で指定 …(B)
@InterceptorRef(value="defaultStack" ,
params={"scopedModelDriven.scope", "session" , "scopedModelDriven.name" , "sesModel"}),
}
)
public String execute() throws Exception {
log.debug(model.getName());
log.debug(model.getAddress());
return "success";
}
// scopeKeyとmodelを用意し、set/getを用意する …(C)
public String getScopeKey() {
return scopeKey;
}
public void setModel(ModelDrivenSample model) {
this.model = model;
}
public void setScopeKey(String scopeKey) {
this.scopeKey = scopeKey;
}
public ModelDrivenSample getModel() {
return model;
}
private String scopeKey;
private ModelDrivenSample model;
}
重要な点は以下の3つです。
- (A)Actionクラスの宣言部のScopedModelDrivenの< >内にてパラメータをバインドするクラスも宣言する
- (B)(A)にて宣言したクラスを扱うためにmodelフィールドと、バインドするキー名を自動設定するためにscopeKeyフィールドを用意する
- (C)必要に応じて、(B)で設定するキー名とバインドするスコープを定義する。
今回の設定では、defaultStack内にあるScopedModelDrivenインターセプタに対して行いますので、このようなやや特殊な記述になります。ScopedModelDrivenインターセプタへ渡すパラメータは、scopedModelDriven.以降の値になります。
| 項目名 | 型 | 説明 |
| scope | String | バインド先属性。context,session,requestから指定 |
| name | String | バインドする際のキー名 |
先ほどの例では、セッション属性に対して、sesModelのキー名でModelDrivenSampleクラスがバインドされることになります。
ではサンプルを起動させてみます。「http://127.0.0.1:8080/interceptors/scopedmodel/execute.action」を表示します。ModelDrivenインターセプタ同様に値を入力し、「送信する」ボタンを押すことでScopedModelDrivenインターセプタが稼動します。

