Struts2の内部オブジェクトとは
Struts2の内部オブジェクトとは、Struts2が動作する上で必要な設定・情報・サーブレットとの関連情報を扱えるオブジェクトたちで、ユーティリティとして使えるものです。
便利な機能が内包されており、中にはActionクラス以外にもStruts2が動作していればどこでもアクセスできる利点があります。
ActionContext
一番よく使うクラスです。インターセプタやViewの共通化でも使え、Struts2がActionクラスを実行した結果やView層に渡すときの情報一式にアクセスできます。
ActionContextの取得
ActionContext actionCtx= ActionContext.getContext();
ActionContextの取得は、Struts2が動作するクラスであればどこでも取得可能です。
例えば、Validationの実装クラス、set/getのみ実装しているDTO、POJOになっているロジック、果ては他のフレームワーク管理下にある実装クラスでも可能です。
Actionクラス名が受け取ったリクエストパラメータを取得する
Map<String,Object> parameters = actionCtx.getParameters();
パラメータ名はMapのキーです。リクエストパラメータの内容を再取得したい場合に使います。
Actionクラスを実行するインスタンスを取得する
ActionInvocation invoker = actionCtx.getActionInvocation();
Actionクラスの実行を命令できるインスタンスを取得します。 invoke()でActionクラスが動き、Actionクラスの実行結果 result のStringを受け取れます。インターセプタを自作し、Actionクラスの実行制御する場合に使います。
Actionクラスの実行~View層で利用する情報を取得する
Struts2内部ではサーブレットのスコープ以外に独自のデータ領域を持っており、これをValueStackと呼んでいます。
このValueStackはStruts2標準ではOGNL式でアクセスできるOgnlValueStackを扱います。このOgnlValueStackはActionクラスのフィールドにアクセスできます。これによりActionクラスの実装しているインタフェース(Aware)次第で、フィールドエラー情報やセッション情報などもActionクラス経由で取得可能です。
ValueStack valueStack = actionCtx.getValueStack();
Object value = valueStack.findValue("dto.username", true);
OGNL式でActionクラスのフィールド名を指定できますので、ネストしたオブジェクトも参照できます。
自動型変換エラーを取得する
Struts2はリクエストパラメータを、Actoinクラスのフィールドへ自動型変換します。サーブレット仕様のリクエストパラメータはStringないしはString[]になりますが、これがActionクラスのフィールドに合わせて型変換を試行します。そのときに変換できなかった(例えばInteger型のフィールドに対して、パラメータが abc だったなど)場合には、型変換エラーとしてStruts2内部で蓄積し、Actionクラスのフィールドには何も反映されません。
この型変換エラー情報を取得できます。
Map<String,Object> convertionErrors = actionCtx.getConversionErrors();
View層、テンプレートクラスで型変換失敗をしたパラメータを出力するときに使います。