(3) ParametersInterceptor
リクエストパラメータをActionクラスへバインドする際に自動的に使われるインターセプタで、他のインターセプタやStruts 2のプラグイン機能の基本となっています。解除される場合にもカスタマイズされる場合にも他への影響は非常に大きくなりますので、変更や解除をすることは非常に稀です。デフォルトでは常に使われるインターセプタです。
(4) StaticParametersInterceptor
各Actionクラスの定数、初期値を定義できるようにするインターセプタです。Actionクラスにて設定された変数は、リクエストパラメータの値を特定の値へ変換するか、強制的に設定値へ上書きするかを選択させることができます。
利用する際にはParameterizableインターフェイスを実装します。ParameterizableインターフェイスによりActionクラスの定数をMap形式で取り扱いますがこのMapはUnmodifiableMap(参照のみ可能なMap)ですので、Actionクラス内での内容変更は許可されていません。次にサンプルコードを示します。
@Namespace(value="/params")
@ParentPackage(value="struts-default")
@InterceptorRefs({
@InterceptorRef(
value="defaultStack" ,
params={"staticParams.merge" , "true" , // リクエストパラメータとのマージ設定…(A)
"staticParams.overwrite","false"}), // リクエストパラメータを強制上書き…(B)
})
@Results({
@Result(name="success" , location="success.jsp"),
})
public class StaticParamsSampleAction extends ActionSupport implements
Parameterizable {
private static Logger log = Logger.getLogger(StaticParamsSampleAction.class);
// key1の値をvalue1に指定する …(C)
@Action(value="start" , params={"key1","value1"})
public String execute() throws Exception {
log.debug(params);
log.debug(key1);
log.debug(key2);
return "success";
}
public void addParam(String key, String value) {
params.put(key, value);
}
public Map<String, String> getParams() {
return params;
}
public void setParams(Map<String, String> params) {
this.params = params;
}
}
StaticParamsInterceptorの振る舞いについては、以下の一覧表になります。
| 項目名 | 型 | 説明 |
| merge | boolean | true時に指定されたパラメータがnullだった場合に初期値を設定する |
| overwrite | boolean | true時には指定されたパラメータを強制的に設定する |
リスト中の(A)および(B)の箇所で定義されます。(A)の箇所にてtrueを指定すると、リクエストパラメータから取得した値に対して、もし指定したパラメータがnullであった場合には、StaticParamsInterceptorが上書きを行う処理稼働します。さらに(B)の箇所にてtrueを指定すると、どんな値が入ってきたとしても強制的に上書きするようになります。上書き設定を行うのは各Actionのparams設定である(C)の箇所で行います。
このサンプルでは、(A)でtrue、(B)でfalse、(C)でkey1の値はvalue1であると定義していますので、もしkey1がnullであった場合には、value1となります。このActionを次のリクエストパラメータを含めて起動したログは次のようになります。「http://127.0.0.1:8080/interceptors/params/start.action?key2=value2」と定数で定義したkey1を含めないリクエストを投げてみると、次の結果になります。
[seren.lumi2.action.StaticParamsSampleAction] - {key1=value1}
[seren.lumi2.action.StaticParamsSampleAction] - value1
[seren.lumi2.action.StaticParamsSampleAction] - value2
key1の値がActionクラスの初期値で定義されていますので、value1となります。
このようにHTMLやJSPなどの画面側で初期値を設定することなく、Actionクラス側で初期値を設定することができますので、例えば検索結果一覧のページング機能などで初期値がnullだった場合にページ番号を1とする、といった初期化の設定や、ウィザード形式の入力画面にて、あらゆる画面から来ても初期値を空文字にしておくなど、初期設定を画面側に持たすことなくアプリケーション側にすべて持たせることができます。
