Velocity

Velocityについて

コミュニティ

ドキュメント

ツール

比較

日本語訳について

目次
  1. JSPを使わなくてはならないなら・・・
  2. Velocity タグライブラリを使う
  3. Velocity タグライブラリのビルド
  4. 設定


JSPを使わなくてはならないなら・・・

時には、選択できないこともあります。技術の決定は、 とても多くの要因に基づいて行われ、その要因は、ネットワークにもとづく外部的なもの (「彼らが使っているから・・・」)から 過去の資産への配慮 (「彼らが使ったから・・・」)まで様々です。

JSP を使用せざるを得ない人のために、シンプルな制御指示子や Java オブジェクトモデルとの強力な結びつきといった Velocity の利点を生かせる JSP タグライブラリを提供しています。 JSP で Velocity を使うのはこんなに簡単です。

<%@ taglib uri="/WEB-INF/veltag.tld" prefix="vel" %>

<html>
<head>
  <title> Velocity! </title>
</head>

<jsp:useBean id="mybean"  class="GeirBean" />

<body>
    <vel:velocity strictaccess="true">

         #set($mybean = $scopetool.getPageScope("mybean"))

         #if(true)
            this is true!
         #end

         <br>

         $mybean.string

         <br>

        #foreach($item in $mybean.array) 
            $item <br>
        #end

    </vel:velocity>
</body>
</html>

すごく簡単でしょ?

利点は何?

この話題にとりくむ際に最初に聞かれる質問は、「「純粋な」Velocity と比べて、 どんな利点があるのか?」といったものです。 一般に、Velocity のみのシステムから、JSP ページに Velocity を埋め込んだ JSP システムに移行しなければならない理由はほとんどありません。 もしそうしたいと思うのなら、その唯一の理由は、 既存の JSP タグライブラリを使いたいのにソースコードがないからか、 ソースはあるがタグライブラリのコア機能のクラスに手を入れたくないからでしょう。 そうでないなら、こうしたコアのクラスをコンテキストに入れて、 Velocity テンプレート内で直接アクセスすれば済むからです。

したがって、このアプローチが役に立つのは、JSP が中心的な環境で、 既存のアプリケーションが JSP で書かれていて、機能を追加・変更したい場合です。 Velocity は以下のような機能を提供します。

  • タグライブラリのシェルを作成しなくても、Java オブジェクトに簡単にアクセスできます。 public インタフェースに public メソッドがあれば、それをスコープにそのまま入れて、 直接アクセスできます(あるいは、自分のクラスのインスタンスを生成するツールも使えます)。
  • 複雑な Java オブジェクトに簡単にアクセスできます。 JSP では $foo.bar( $thing ).getIterator().hasNext() といった、 任意の呼び出し連鎖には簡単にアクセスできません。
  • 好みの問題ですが、Velocity の制御指示子 (#if()、#else()、#elseif()、#foreach()) を、 同じ機能のタグライブラリよりも好む人もいます。古代ローマの諺にあるように、 「人の好みについては議論すべきではありません (De gustibus non est disputandum)」。
  • 複雑な Java オブジェクトから JSP への橋渡しが簡単です -- たとえば、 実行時にオブジェクトを動的に選択/作成して JSP の他の部分でアクセスできるようにスコープにつっこみたい場合は、こんな風にできます。
             <vel:velocity strictaccess="true">
                 #set($reqbean = $scopetool.getRequestScope("beaninrequest"))
                 #set($newthing = $reqbean.getThing().makeBlue("azure"))
                 $request.getSession().setAttribute("bluething", $newthing)
             </vel:velocity>
         
    まあこんな感じです :)
  • 何がなくとも、Velocimacro があります。


Velocity タグライブラリを使う

Velocity と JSP をまとめる際の最大の問題は、 スコープとBeanアクセスに関する「インピーダンスマッチング」です。 JSP での基本的なデータ格納メカニズムである「スコープ」は、ベースにある Servlet API から派生した考え方で、データオブジェクトが、 ページ/リクエスト/セッション/アプリケーション内で保存・取得されます。 Velocity は「コンテキスト」と呼ばれる非階層的な仕組みでデータを管理しており、 テンプレートでアクセス可能なデータの管理は、コントローラである Servlet など、ビュー以外のコードが行うことを前提としています。

したがって、Velocity タグライブラリを使って JSP 内で簡単にデータアクセスするために、 2種類の方法が提供されています。自動アクセスと厳密アクセスという2種類の方法で、 2通りの異なるやり方でのデータの管理やアクセスが可能となっています。 併用も可能です。

自動スコープアクセス

1つ目のやり方である、自動アクセスの方が便利です。 (VTL「リファレンス」を通して) オブジェクトが参照される場合、 同じ ID のオブジェクトを見つけるためにスコープが検索されます。 スコープは以下の順序で検索されます

  1. ページスコープ
  2. リクエストスコープ
  3. セッションスコープ
  4. アプリケーションスコープ

自動スコープアクセスは、デフォルトで使えます。 自動スコープアクセスを使うには、名前で 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>

こちらも、かなり簡単です。


Velocity タグライブラリのビルド

Velocity タグライブラリを使う場合、メインの Velocity の JAR ファイルにはまだ含まれていないので、ビルドする必要があります。 Jakarta での伝統に従い、ビルドを非常に簡単にしました。 このプロジェクトのコードは、配布の contrib セクションの /contrib/temporary/veltag の下 [ http://cvs.apache.org/viewcvs/jakarta-velocity/contrib/temporary/veltag/] に置いてあります。一時的なディレクトリの下にあるのは、このパッケージは Jakarta Taglibs プロジェクトに受け入れられることを希望しているからです。

JJARを使う簡単な方法

Veltag タグライブラリは、新しい実験的な Jar ファイル管理ツールである JJAR (Jakarta Jar Archive & Repository) を使ってビルドできます。このツールは、タグライブラリを簡単にビルドできるように、 依存するライブラリを見つけて取り出してくれます。

注意:JJAR は現在開発中です -- JJAR ベースのビルドが動作するように、 あらゆる努力をしていますが、動作しない可能性もあります。 その場合には、後で示す一般的な方法で行ってください。

JJAR でビルドする手順は以下の通りです。

  1. すぐれたビルドツールである、Ant がインストールされていなければなりません。
  2. CVS または夜間スナップショットから Velocity 配布を取得します。
  3. Velocity 配布の /contrib/temporary/veltag ディレクトリへ移動します。
  4. 以下のようにタイプします。
          $ ant getjars
        
    こうすれば、JJAR を取得し、そのJJAR を使って、 本日の Veltag の依存ライブラリを取得できます。
  5. 以下のようにタイプします。
          $ant jar
         
    これで、veltag-XX.jar(XX = 現在のバージョン)がビルドされます。

以上です。かなり簡単です。

JJARが不安な人のための方法

JJAR ベースでのビルドがうまくいかなかった場合や、 JAR ファイルを探して回るのが好きな人は、 以下の手順で Veltag をビルドして下さい。

ビルドで必要な手順は以下の通りです。

  • すぐれたビルドツールである、Ant がインストールされていなければなりません。
  • Servlet API の JAR ファイルが必要です。Servlet 2.2 API はここ から、Servlet 2.3 APIはここ からも取得できます。 注意: JSPユーザであれば、使用しているサーブレットエンジンに含まれています。 [訳注:例えば Tomcat 4であれば、$CATALINA_HOME/common/lib/servlet.jar がそれです。]
  • velocity.jar。これはもちろん、 ここで見つけることができます。
  • ビルドスクリプトは、Servlet と Velocity の JAR ファイルを /contrib/temporary/veltag/lib/ ディレクトリで見つけることを想定しています。 これらのファイルが他の場所にあっても、ビルドスクリプトの修正は簡単です。 /contrib/temporary/veltag/build.xml ファイルにある 「servlet.home」と「velocity.home」を探して[指定を変更して]ください。
  • ここまでがすべて完了したら、 Velocity 配布の /contrib/temporary/veltag に移動して 「ant」とタイプします。JAR ファイルがビルドされます。


設定

このタグライブラリを使うのは非常に簡単です。以下の説明は、 Tomcat のような JSP をサポートする Servlet コンテナをセットアップしており、 簡単な JSP ページを書いて表示させられるだけの知識があることを 前提としています。また、すべてのディレクトリ参照は、Velocity 配布ではなく、 veltag プロジェクトのルートの相対パスです。

Velocity Taglib をテストするには

veltag-XX.jar を Web アプリケーションの WEB-INF/libディレクトリにコピーしてください。 (XXは、現在のバージョン番号です)
タグライブラリ記述子のサンプルである/examples/veltag.tld を あなたのWebアプリケーションの WEB-INF ディレクトリにコピーしてください。
最後に、以下の内容を web.xml ファイル内の <webapp> セクションに追加してください。
     <taglib>
       <taglib-uri>http://jakarta.apache.org/taglibs/veltag-1.0</taglib-uri>
       <taglib-location>/WEB-INF/veltag.tld</taglib-location>
     </taglib>
   

JSP サンプルを使いたい場合は、上記に加えて、 examples/SimpleBean.java をコンパイルし、 生成される SimpleBean.class を Web アプリケーションの WEB-INF/classes ディレクトリ内に置く必要があります。

その上で、examples/ にある JSP のサンプルを試してください。 この JSP を Web アプリケーションのルートにコピーし、ブラウザで見ます。 楽しんでみてください。

コメントや質問、修正や貢献については、 Geir Magnusson Jr. または Velocity ユーザ メーリングリストに連絡してください。 Velocity メーリングリストに参加するには、 このページ を読み、ページの指示に最後まで従ってください。

注意: このコードは、公式の Velocity 配布の一部ではありません。 [訳注:つまり、通常ダウンロードする .zip ファイルや .tar.gz ファイルには含まれていません。上にも書いたとおり、コードはhttp://cvs.apache.org/viewcvs/jakarta-velocity/contrib/temporary/veltag/ にあります。]



このドキュメントは、 熊坂祐二 、 高橋達男 、 新穂洋史 が訳しました。
コメントがある場合は、 report@jajakarta.org までお願いします。
オリジナル英文 Copyright © 1999-2003, The Apache Software Foundation