Velocity と JSP をまとめる際の最大の問題は、
スコープとBeanアクセスに関する「インピーダンスマッチング」です。
JSP での基本的なデータ格納メカニズムである「スコープ」は、ベースにある Servlet API
から派生した考え方で、データオブジェクトが、
ページ/リクエスト/セッション/アプリケーション内で保存・取得されます。
Velocity は「コンテキスト」と呼ばれる非階層的な仕組みでデータを管理しており、
テンプレートでアクセス可能なデータの管理は、コントローラである
Servlet など、ビュー以外のコードが行うことを前提としています。
したがって、Velocity タグライブラリを使って JSP 内で簡単にデータアクセスするために、
2種類の方法が提供されています。自動アクセスと厳密アクセスという2種類の方法で、
2通りの異なるやり方でのデータの管理やアクセスが可能となっています。
併用も可能です。
自動スコープアクセス
1つ目のやり方である、自動アクセスの方が便利です。
(VTL「リファレンス」を通して) オブジェクトが参照される場合、
同じ ID のオブジェクトを見つけるためにスコープが検索されます。
スコープは以下の順序で検索されます
- ページスコープ
- リクエストスコープ
- セッションスコープ
- アプリケーションスコープ
自動スコープアクセスは、デフォルトで使えます。
自動スコープアクセスを使うには、名前で Bean にアクセスするだけです。
例えば、
 |
 |
 |
 |
<!-- ページスコープに Bean を設定 -->
<jsp:useBean id="mybean" class="GeirBean" />
<vel:velocity>
<!-- IDでアクセスするだけで、コンテキストは -->
<!-- 自動的にオブジェクトを見つけてくれます -->
#foreach($item in $mybean.array)
$item <br>
#end
</vel:velocity>
|
 |
 |
 |
 |
自動スコープアクセスの方が簡単ですが、既存のアプリケーションと統合するためには、
もう一つのアクセスモードである厳密スコープアクセスを使うか、
あるいは両者を組み合わせて使う必要があるかもしれません。
厳密スコープアクセス
自動スコープアクセスの代替手段(または追加手段)が、厳密スコープアクセスと呼ばれているものです。
厳密スコープアクセスとはどういうことかというと、Velocity
コンテキストがスコープを検索してくれない
-- テンプレートで使用するために用意されている ScopeTool を使って、
直接オブジェクトを取り出さなければならない -- ということです。
これは通常の JSP により近いモデルで、
デザイナはオブジェクトがどのスコープに保存されているかを把握しなければなりません。
例えば、以下の JSP のコードでは、ScopeTool
を使ってリクエストスコープ内のオブジェクトにアクセスし、
オブジェクトを Velocity コンテキストに追加する方法を示しています。
<vel:velocity strictaccess="true"> タグで、
strictaccess プロパティが true に設定されているのに注目してください。
こうすれば Veltag タグライブラリが自動スコープ検索を行わないようになります。
注意:strictaccess をオフのままにしておき(または false に設定し)、
その上でどこからのオブジェクトかを気にしないですむように ScopeTool を使うことで、
2つのモードの混在も可能です。
 |
 |
 |
 |
<jsp:useBean id="beaninrequest" class="GeirBean" scope="request" />
<vel:velocity strictaccess="true">
#set($reqbean = $scopetool.getRequestScope("beaninrequest"))
$reqbean.string
<br>
#foreach($item in $reqbean.array)
$item <br>
#end
</vel:velocity>
|
 |
 |
 |
 |
こちらも、かなり簡単です。