[Struts2] Value Stack

Value Stack は Struts2 のひとつ特徴的な機能かな。便利ではあるけれど、どういう動作をしているかがちゃんとわからないと気持ち悪い。

まず簡単な利用法としては、ビューから Action クラスの getter メソッドに簡単にアクセスできる。Action クラスに getName() というメソッドがあれば、

${name}

でその値が取得できる(テンプレートエンジンは FreeMarker として)。ここまでは良い。

ちょっとわかりにくいのは Value Stack にはいくつかのスコープがあり、それらに透過的にアクセスできること。スコープは 4 つあり、以下の優先度で検索される。

  1. 一時オブジェクト (ループ変数とか、テンプレート内で生成されるオブジェクト)
  2. モデルオブジェクト
  3. アクションオブジェクト
  4. 名前指定オブジェクト (application とか scope とかのサーブレットでのスコープオブジェクト。#scope.hoge とかでアクセスできる)


さっきの例はアクションオブジェクトなので優先度は 3 番目だ。なのでモデルオブジェクトにも同じ getName() というメソッドがあればそちらが優先されてしまう。これは名前が衝突したときにはまりそうだ。

ここでモデルオブジェクトはアクションに関連づけられたモデルのオブジェクトで、ModelDriven インターフェイスを実装した Action クラスの getModel メソッドで取得できるオブジェクトのこと。ModelDriven についてはまた別のところで書くか(気が向けば)。

あとここまでの説明では Value Stack はまったくスタックらしくなかったが、もちろん Value Stack はスタックである。たとえばテンプレート内でネストさせたループを考えればわかりやすいが、複数のオブジェクトを積むことができ、最上位のオブジェクトに簡易にアクセスできるようになっている。