はじめに
今回も引き続きStruts 2のインターセプタの紹介となります。今回はパラメータ操作の補助を行うものと、デバッグ機能を提供するインターセプタを紹介します。
対象読者
Struts 2のWebアプリケーション開発に興味ある方
必要な環境
最低動作環境は次のとおりです。
- Java SE 5
- Struts 2.1.6が動作する環境
- Tomcat 5.5.x / 6.0.x
開発環境のインストールについては、WINGSプロジェクトのサーバサイド環境構築設定ページなどを参考にしてください。
また、Struts 2の入手はプロジェクトのWebページより行えます。現時点での最新リリース版は2.1.8.1です。
パラメータ操作に関するもの
ここでは、画面からのリクエストパラメータをActionのクラスに渡す処理を補佐するインターセプタを紹介します。これらは使いこなすと非常に便利な機能でもあり、標準機能として搭載されているのが特徴です。利用される場合には、定められた宣言ルールに従うことで使うことができますので、用途に合わせて正しく使いましょう。
(1) ModelDrivenInterceptor
ModelDrivenインターフェイスを実装することで、Actionクラスのmodelフィールドに対してgetModel()で実装した内容のインスタンスがバインドされます。このインターフェイスによって、リクエストパラメータの名前とmodelにて指定したクラスのフィールド名が合致したものは自動的に値がすべてバインドされます。これによりModelDrivenInterceptorはActionクラスの実装をスリムにすることができます。
/** * ModelDriven実装=implements ModelDriven<モデルクラス>…(A) */ public class ModelDrivenSampleAction extends ActionSupport implements ModelDriven<ModelDrivenSample> { private static Logger log = Logger.getLogger(ModelDrivenSampleAction.class); @Action("execute") public String execute() throws Exception { log.debug("name:" + model.getName()); log.debug("address:" + model.getAddress()); return "success"; } /** * ModelDrivenの結果を返す。該当するリクエストパラメータがバインドされる。…(B) * @return ModelDrivenSampleインスタンス。 */ public ModelDrivenSample getModel() { model = new ModelDrivenSample(); return model; } // リクエストパラメータをバインドするPOJOクラス…(B) private ModelDrivenSample model; }
利用するための重要な点は次の2つです。
- (A)Actionクラスの宣言部のModelDrivenの< >内にてパラメータをバインドするクラスも宣言する。
- (B)(A)にて宣言したクラスを取得するためにgetModel()を実装し、フィールド変数名もmodelとする。
設定ファイルを特に変更せずに使うことができます。
ModelDrivenインターフェイスを経由することでリクエストパラメータを格納するためのフィールドをActionクラスに記述せずに済み、1つの別クラスへ委譲することができます。これによりActionクラスの実装量を減少させることができます。Actionクラスを手早く作成する際に欠かせないものとなります。
ではサンプルを稼動させてみましょう。「http://127.0.0.1:8080/interceptors/model/execute.action」をブラウザで表示します。すると次の画面が出力されますので、それぞれのテキストボックスへ値を入れ「送信する」ボタンを押します。
入力欄に上から「お名前」「住所」と入力し「送信する」ボタンを押すとActionクラスのログは次のように表示され、確かにModelDrivenインターフェイスによってリクエスト値が指定されたクラスへバインドされたことが分かります。
DEBUG [seren.lumi2.action.ModelDrivenSampleAction] - name:お名前 DEBUG [seren.lumi2.action.ModelDrivenSampleAction] - address:住所