Java 構築ツールの Jakarta Ant をまだインストールしていない場合には、まずそれをインストールしてください。 Velocity を使用するには必要ありませんが、Velocity を構築するのに必要です。
配布の
build
ディレクトリに移動します。
ant <build target>
とタイプします。<build target> は以下のうちのどれかです。
jar
bin
ディレクトリに Velocity の完全版の jar ファイルを構築します。jar ファイルは、'velocity-X.jar' という名前で、 「X」は、現在のバージョン番号です。このjarファイルにはVelocity で必要なコンポーネントは含まれていません。このターゲットを使う場合は、 Jakarta Commons から Collections コンポーネントを入手し、クラスパス (あるいは WEB-INF/lib)に追加する必要があります。 ビルドインされたログ機能やテンプレート変換機能を使いたい場合は、 クラスパスか Web アプリケーションの WEB-INF/lib に jar ファイルを適宜含めなければなりません。 便宜上、ORO、Logkit、Commons Collections を含めた jar ファイルを構築できる jar-dep タスクを使うこともできます。
jar-dep
bin
ディレクトリに Velocity の完全版の jar ファイルを構築します。この jar ファイルには、Jakarta Avalon Logkit パッケージによるロギングに必要なサポートや、Jakarta Commons による重要な設定のサポートや、 Jakarta ORO パッケージを使った WebMacro テンプレート変換に必要なサポートが含まれています。
jar-core
bin
ディレクトリにサイズの小さな「velocity-core-X.jar」という 名前のVelocity JAR ファイルを構築します。この JAR ファイルには、Velocity 機能のコアが含まれていますが、サンプルや、Anakia、Texen、VelocityServlet をサポートする基本クラスといったユーティリティは含まれていません。
jar-util
bin
ディレクトリに「velocity-util X.jar」という名前の ユーティリティ Velocity JAR ファイルを 構築します。この JAR ファイルには、 Anakia、Texen 、 WebMacro テンプレート変換ユーティリティといった、 ユーティリティのコードが入っています。通常の
jar
ターゲットと同様の外部依存が必要です。
jar-servlet
bin
ディレクトリに「velocity-servlet X.jar」という名前の ユーティリティ Velocity jar ファイルを構築します。この jar ファイルには、 サーブレットプログラマ向けのユーティリティのコードがあります。 通常の
jar
ターゲットと同様の外部依存が必要です。
jar-j2ee
「jar」ターゲットと同様に、 J2EE サポートを必要とするすべてのコンポーネントが含まれている、 完全な jar を構築します。現在のところ、 org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader だけしか含まれません。他のものと同様に、「velocity-j2ee-X.jar」という名前で、
VelocityContext context1 = new VelocityContext();
context1.put("name","Velocity");
context1.put("project", "Jakarta");
context1.put("duplicate", "I am in context1");
VelocityContext context2 = new VelocityContext( context1 );
context2.put("lang", "Java" );
context2.put("duplicate", "I am in context2");
template.merge( context2, writer );
Velocity 開発者ガイド
Velocity 開発者ガイド
Velocity 開発者ガイド
Velocity 開発者ガイド
上記のコードでは、 context2 が context1 に連鎖するように context2 を設定しました。つまり、テンプレートでは二つの VelocityContext オブジェクトのどちらに設定した項目でも、オブジェクト追加時に使ったキーが重複しない限りはアクセスできるということです。上記の「duplicate」というキーのように、重複している場合は、連鎖の後方のコンテキストに格納されたオブジェクトが利用できます。上記の例でいえば、オブジェクトとして返されるのは、「I am in context2」という文字列となります。
このような、コンテキストの項目の重複または「被覆」 (covering) によって、覆われたオブジェクトに害が及んだり変更されたりはしないことに注意して下さい。したがって上記の例では、「I am in context1」は無事ですし、context1.get("duplicate") でアクセスできます。しかし、テンプレート内では「$duplicate」というリファレンスの値は「I am in context2」となり、覆われた「I am in context1」という文字列に、テンプレートはアクセスできません。
メソッドでも行なえます。このメソッドの場合は、 VMに好きな名前をつけ、VMへの引數となる配列やデータのコンテキスト、それに出力先のWriterを生成します。注意: VM の引數は、引數として使う文字列データではなく、Context 内のデータオブジェクトの「キー」でなければなりません。これは将來変更される可能性があります。
が、関連する Class やメソッド名、投げられた例外とともに起動します。このハンドラは、メソッド呼び出しの返り値として使われる使われる有効なオブジェクトを返すか、引數として渡された例外、あるいは新しい例外を投げます。新しい例外の場合は、
MethodInvocationException
としてラップされてユーザに伝搬されます。
public interface MethodExceptionEventHandler extends EventHandler
{
public Object methodException( Class claz, String method, Exception e )
throws Exception;
}
EventCartridge の使い方
EventCartridge の使い方はとても簡単です。以下の例は、
org.apache.velocity.test.misc.Test
から抜粋したものです。
Velocity 開発者ガイド
Velocity 開発者ガイド
Velocity 開発者ガイド
Velocity 開発者ガイド
...
import org.apache.velocity.app.event.EventCartridge;
import org.apache.velocity.app.event.ReferenceInsertionEventHandler;
import org.apache.velocity.app.event.MethodExceptionEventHandler;
import org.apache.velocity.app.event.NullSetEventHandler;
...
public class Test implements ReferenceInsertionEventHandler,
NullSetEventHandler,
MethodExceptionEventHandler
{
public void myTest()
{
....
/*
* ここでは、Test クラスは、イベントハンドラインタフェースを
* サポートするように正しいメソッドを実裝していると仮定します。
* これらを使うにはまず、カートリッジを新しく作ります。
*/
EventCartridge ec = new EventCartridge();
/*
* そして、このクラスをハンドラに収容するように登録します
*/
ec.addEventHandler(this);
/*
* 最後に カートリッジそのものをコンテキストに取り付けます。
*/
ec.attachToContext( context );
/*
* あとは、いつものようにコンテキストをテンプレートにマージします。
*/
....
}
/*
* ここで、イベントハンドラの実裝を行ないます。
*/
public Object referenceInsert( String reference, Object value )
{
/* リファレンスを使って何かします */
return value;
}
public boolean shouldLogOnNullSet( String lhs, String rhs )
{
if ( /* 何らかのルール */ )
return false;
return true;
}
public Object methodException( Class claz, String method, Exception e )
throws Exception
{
if ( /* 何らかのルール */ )
return "I should have thrown";
throw e;
}
}
Velocity は柔軟で単純なテンプレート言語であるため、 XML データを利用するのに理想的な環境となっています。Anakia は、 XML からの出力処理で XSL を置き換えるのに Velocity を利用する例です。このドキュメンテーションを含む Velocity サイトは、Anakia を使って、 XML ソースから生成しています。 Jakarta サイトもまた Anakia を使用して処理されています。
Velocity で XML を扱うパターンとしては、XML を Java アクセスしやすいデータ構造に変換できる JDOM などを使うのが一般的です。その場合、XML ドキュメントから (JDOM ツリー経由で) 直接データアクセスするテンプレートを生成します。例として、次の XML 文書を使ってみましょう。
Velocity で XML データを整形する大きな利點の一つは、アプリケーションが用意する他のオブジェクトやデータにアクセスできるということです。その XML 文書にあるデータが使えるだけではありません。出力に関する追加情報を提供するためにコンテキストに何でも追加できますし、 XML データを使いやすくするツールも提供できます。 Bob McWhirter のWerken Xpath はこの種の便利なツールの一つです ─ Anakia での使い方の例は
org.apache.velocity.anakia.XPathTool
にあります。
XML と Velocity で起こる問題の1つに、XML エンティティをどう扱うかというものがあります。テクニックの一つとして、エンティティを処理して出力ストリームに送る際に、 Velocimacro と組み合わせて使うという方法があります。