<?xml version="1.0" encoding="Shift_JIS"?>

<document>

 <properties>
  <title>Developer's Guide</title>
  <author email="geirm@apache.org">Velocity Documentation Team</author>
  <translator>熊坂祐二</translator>
  <original>developer-guide</original>
 </properties>

<body>

<section name="Contents">

                                    <p>
<ol>

<li>
<a href="developer-guide.html#Introduction">はじめに</a>
</li>

<li>
<a href="developer-guide.html#Resources">リソース</a>
</li>

<li>
<a href="developer-guide.html#How Velocity Works">Velocity の動作原理</a>
<ul>
 <li><a href="developer-guide.html#The Fundamental Pattern">基本パターン</a></li>
</ul>
</li>

<li>
  <a href="developer-guide.html#To Singleton Or Not To Singleton...">Singletonにすべきか、すべきでないか...</a> 
   <ul> 
     <li><a href="developer-guide.html#Singleton">Singleton モデル</a></li> 
     <li><a href="developer-guide.html#Separate">インスタンスの分離</a></li> 
   </ul> 
   </li> 
<li>
<a href="developer-guide.html#The Context">コンテキスト</a>
<ul>
<li><a href="developer-guide.html#The Basics">基本</a></li>
<li><a href="developer-guide.html#Support for Iterative Objects for #foreach()">インタラクティブにオブジェクトをサポートする #foreach()</a></li>
<li><a href="developer-guide.html#Context Chaining">コンテキスト・チェイン</a></li>
<li><a href="developer-guide.html#Objects Created in the Template">テンプレートで作成されたオブジェクト</a></li>
<li><a href="developer-guide.html#Other Context Issues">その他のコンテキスト問題</a></li>
</ul>
</li>

<li>
<a href="developer-guide.html#Using Velocity In Servlets">ServletでVelocityを使う</a>
<ul>
<li><a href="developer-guide.html#Servlet Programming">サーブレット・プログラミング</a></li>
<li><a href="developer-guide.html#Deployment">展開</a></li>
</ul>
</li>

<li>
<a href="developer-guide.html#Using Velocity In General Applications">一般的なアプリケーションでVelocityを使う</a>
<ul>
<li><a href="developer-guide.html#The Velocity Helper Class">Velocityヘルパークラス</a></li>
<li><a href="developer-guide.html#Exceptions">例外</a></li>
<li><a href="developer-guide.html#Miscellaneous Details">いろいろな詳細</a></li>
</ul>
</li>

<li>
<a href="developer-guide.html#EventCartridge and Event Handlers">EventCartridge とイベントハンドラー</a>
</li>

<li>
<a href="developer-guide.html#Velocity Configuration Keys and Values">Velocity設定キーと値</a>
</li>

<li>
<a href="developer-guide.html#Configuring the Log System">ログシステム設定</a>
 <ul>
  <li>
    <a href="developer-guide.html#Simple Example of a Custom Logger">カスタムログの簡単な例</a>
  </li>
 </ul>
</li>

<li>
<a href="developer-guide.html#Configuring Resource Loaders">リソース読み込み設定 (テンプレートローダー)</a>
<ul>
  <li>
    <a href="developer-guide.html#Configuration Examples">設定例</a>
  </li>
 </ul>
</li>

<li>
<a href="developer-guide.html#Template Encoding for Internationalization">国際化のためのテンプレートエンコーディング</a>
</li>

<li>
<a href="developer-guide.html#Velocity and XML">Velocity と XML</a>
</li>

<li>
<a href="developer-guide.html#Summary">まとめ</a>
</li>

</ol>
</p>

</section>

<section name="Introduction">
<p>
Velocity は、Java に基づくテンプレート・エンジンであり、あなたのデータをフォーマットしたり表示したりするために、文書をレンダリングしたり容易に作成するための単純で強力な開発ツールです。
このガイドでは、Velocity を使用した開発の基本概要について説明していきます。
そして、Velocityの使い方のために2つの主な使い方に焦点を当てます：
</p>

<ul>
<li>サーブレットベースの WWW 開発</li>
<li>一般的なアプリケーションでの使用</li>
</ul>

<p>
Velocity を使ってあなたのサーブレットでクラスに基づいた VelocityServlet クラスを
使って非常に簡単にサーブレットを開発すること、役に立つユーティリティクラスを
使用してアプリケーション開発をすることに関して、あなたは、これらの間に本質的な
違いはないということが分かると思います。
</p>

 <p>
<strong>はじめに</strong>
</p>

<p>
この情報は Velocity サイトの上やドキュメントの中のどこか他の場所で見つけられるかもしれませんが、それは完全にここに含まれています。
Velocity をあなたのコンピュータで実行するのは、非常に簡単です。
全てのディレクトリの参照は Velocity 配布ツリーのルートの相対パスに注意してください。

<ol>
  <li>
Velocity 配布を入手してください。
リリース版や、夜間リポジトリスナップショットや、直接 CVS コードリポジトリなどを利用することができます。
うまく動作するとは思いますが、しかし、最新の機能のためには、夜間スナップショットが、おそらく最良の方法でしょう。
詳細情報は、<a href="index.html">ここ</a>を参照してください。
  </li>
  <li>
    Java 構築ツールの
    <a href="http://jakarta.apache.org/ant/">Jakarta Ant</a> を
まだインストールしていない場合には、まずそれをインストールしてください。
Velocity を構築するのに必要ですし、Velocity を<i>使う</i>のにも必要です。
  </li>
  <li>
    配布の <code>build</code> ディレクトリに移動します。
  </li>
  <li>
    <code>ant &lt;build target&gt;</code> とタイプします。ここで &lt;build target&gt; は以下のうちのひとつです。
    <ul>
      <li>
        <b><code>jar</code></b> <code>bin</code> ディレクトリに Velocity
の完全版を構築します。jar は、'velocity-X.jar' と呼ばれます。
ここで「X」は、現在のバージョン番号です。
あなたに特定の格納場所に対する配慮が必要ない限り、
それはあなたが必要とするすべてを含むので、
この jar を使うのが便利です。
      </li>
      <li>
          <b><code>jar-nodeps</code></b> は、完全な Velocity jar を <code>bin</code>
ディレクトリにビルドします。ただし必要なロギングサポート
<a href="http://jakarta.apache.org/commons/">Jakarta Commons</a> の
           <a href="http://jakarta.apache.org/avalon/logkit/index.html">Jakarta 
           Avalon Logkit</a> パッケージや、WebMacro テンプレート変換で必要となる
           <a href="http://jakarta.apache.org/oro/index.html">Jakarta ORO</a>
パッケージは含まれません。このターゲットを使用する場合には、
Jakarta Common のコレクションコンポーネントの jar を取得して
CLASSPATH(またはWEB-INF/lib) に追加しなければなりません。
また、組み込みロギングやテンプレート変換を使用したい場合には、
あなたの CLASSPATH または Web アプリケーションの WEB-INF/lib ディリクトリに jar
を置いてください。
          </li> 
      <li> 
        <b><code>jar-core</code></b>
<code>bin</code> ディレクトリにサイズの小さな「velocity-core-X.jar」という名前の
Velocity jar を構築します。この jar には、Velocity 機能のコアが含まれていますが、
例、Anakia、Texen のようなユーティリティや、
VelocityServer をサポートする基本クラスは含まれていません。
      </li>
      <li>
        <b><code>jar-util</code></b> 
はユーティリティ Velocity jar を <code>bin</code> ディレクトリに構築します。
そして、「velocity-util X.jar」と呼ばれています。
この jar は、ユーティリティ・コード、特に Anakia、Texen と WebMacro テンプレート変換ユーティリティを含みます。
      </li>
      <li>
        <b><code>jar-servlet</code></b> 
はユーティリティ Velocity jar を <code>bin</code> ディレクトリに構築します。
そして、「velocity-servlet X.jar」と呼ばれています。
この jar は、servlet プログラマーのためのユーティリティ・コードを含みます。
      </li>
      <li>
        <b><code>jar-j2ee</code></b> は、
J2EE サポートを必要とするすべてのコンポーネントを含む「jar」ターゲットの様に、
完全な jar を構築します。
現在、これは org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader だけを含みます。
通常通り、それは <code>bin</code> ディレクトリに置かれます。そして、「velocity-j2ee-X.jar」と呼ばれています。
注意：
この構築ターゲットを使用したいときには、build/lib ディレクトリに j2ee.jar
のコピー(またはリンク)を置かなければなりません。
我々は、配布の一部としてそれを提供していません。
よい情報源 http://java.sun.com/ にあります。
        </li> 
         <li> 
           <b><code>jar-J2EE-nodeps</code></b> は、
J2EE サポートの完全な jar をビルドしますが、Jakarta Avalon Logkit と
Jakarta ORO パッケージの regexp サポートを除外します。
           上記の<code>jar-nodeps</code> ターゲットを参照してください。

      </li>
      <li>
        <b><code>examples</code></b>は
<code>examples</code> ディレクトリで見つけられるプログラム例のコードを構築します。
これは、ターゲットがまた、forumdemo プロジェクト例を構築します。
      </li>
      <li>
        <b><code>forumdemo</code></b> は、サンプル Web アプリケーションを
        <code>examples/forumdemo</code> ディレクトリに構築します。
      </li>
      <li>
        <b><code>docs</code></b> は、
Velocity の <a href="anakia.html">Anakia</a> XML 変換ツールを使用して
これらのドキュメントを <code>docs</code> ディレクトリに構築します。
スタイルシートの代わりに Velocity テンプレートを使うことができます。
−試してみてください！


<i>
注：
このターゲットは、jakarta-site2 プロジェクトが jakarta-velocity 配布ディレクトリと同じディレクトリとして位置することを必要とします。
このターゲットについての詳細は build.xml ファイルを見てください。</i>
      </li>
      <li>  
        <b><code>jar-src</code></b> は、
全ての Velocity ソース・コードを一つの jar にまとめます。
そして、<code>bin</code> ディレクトリに置かれます。
      </li>
      <li>
        <b><code>javadocs</code></b> は
<code>docs/api</code> ディレクトリにおいて、Javadoc クラス・ドキュメントを構築します。
      </li>
      <li>
        <b><code>test</code></b> (jar のあとで)それに対する Velocity
テストルーチンの testbed セットに対してテストを行ないます。
      </li>
      <li>  
        <b><code>help</code></b> 利用できる構築ターゲットの一覧を表示します。
      </li>
    </ul>
  </li>
  <li>
テストはビルドでは必要ではありませんが、よい考えです。
上で示される <code>test</code> ターゲットを使ってください。
  </li>
  <li>
これでおしまいです！
Velocity を、使用する準備ができました。
あなたのクラスパスまたは他の適切な場所に jar を置きます（もしサーブレットで使うような webappの lib ディレクトリなど）
  </li>
  <li>
例を試してみたいという場合には、(はじめての場合には特に推奨します)、
<code>ant examples</code> を通して例を構築してください。
  </li>
</ol>
</p>
</section>

<section name="Resources">
<p>
多くのリソースと利用できる例がプログラマーに用意してあります、
そして、我々はあなたが我々の例と、ドキュメントとソース・コードを見ることをお勧めします。
素晴らしいソースの一部は、以下の通りです
</p>

<ul>
  <li>
     ユーザと開発者のコミュニティ : 
     <a href="http://jakarta.apache.org/getinvolved/mail.html">メーリングリスト</a>
     から参加してください。
  </li>
  <li>
     メーリングリスト･アーカイブ : <a href="http://www.mail-archive.com">
    http://www.mail-archive.com</a> は、そのひとつです。 'velocity' と検索語に入れて
    -user, -dev アーカイブを見てください。
  </li>
  <li>
    ソースコード : <code>src/java/...</code> : Velocity プロジェクトのすべてのソースコードがあります。
  </li>
  <li>
    アプリケーション例 1 : <code>examples/app_example1</code> : 
    アプリケーションプログラムで、Velocity をどのように使うか示した簡単な例
  </li>
  <li>
    アプリケーション例 2 : <code>examples/app_example2</code> : 
    Velocity アプリケーション・ユーティリティクラスを使用したアプリケーションプログラムの簡単な例
  </li>
  <li>
    servlet 例 : <code>examples/servlet_example1</code> : 
    サーブレットで Velocity を使用する方法を示した簡単な例
  </li>
  <li>
    logger 例 : <code>examples/logger_example</code> : 
    全てのログメッセージを受信するために Velocity を使ってカスタムログを作成して登録する
    簡単な例
  </li>
  <li>
    XML 例 : <code>examples/xmlapp_example</code> : 
    Velocity テンプレートを使用して XML ドキュメントデータへのアクセスと読み込むために
    JDOM の使い方の簡単な例。ドキュメントツリーを渡り歩くための Velocimacro
    の再帰のデモも含まれます。
  </li>
 <li>
    イベント例 : <code>examples/event_example</code> : 
    Velocity 1.1 の API でイベントハンドリングを使った例
  </li>
  <li>
    Anakia アプリケーション : <code>examples/anakia</code> : 
    XML データのレンダリングのスタイルシートを生成するために Velocity
    を使ったアプリケーションの例
  </li>
  <li>
    フォーム Web アプリ : <code>examples/forumdemo</code> :
    サーブレットベースのフォームアプリケーションの動作例
  </li>
  <li>
    ドキュメント : <code>docs</code> : Velocityプロジェクトのために
    html で生成されたすべてのドキュメント
  </li>
  <li>
    API ドキュメント : <code>docs/api</code> : 
    Velocity プロジェクトのために生成された Javadoc ドキュメント
  </li>
  <li>
    テンプレート : <code>test/templates</code> : 
    テストベッドディレクトリ内のテンプレートの大きな集合で、
    VTL(Velocity Template Language) の使い方のすばらしいソースがあります。
  </li>
  <li>
    context 例 : <code>examples/context_example</code> : 
    Velocity context を拡張することのできる2つの例があります。
    上級者向け。
  </li>
</ul>

<p>
上の全てのディレクトリの参照は、配布ルートディレクトリの相対パスです。
</p>

</section>

<section name="How Velocity Works">

<p>
<a name="The Fundamental Pattern"><strong>'The Fundamental Pattern'</strong></a>
</p>

<p>
アプリケーションプログラムやサーブレットで Velocity を使う場合
(または正確にはその他の場合も)、以下のことを行なう必要があります。
</p>

<ol>
<li>Velocity の初期化。
これは、Velocity のための双方のパターンを使うときに適用し、
シングルトンは、「実行時インスタンス分離」と同じように(
詳細については下記参照)一度だけ行なう必要があります。</li>
<li>Context オブジェクトの生成(詳細は後述)</li>
<li>Context へあなたのデータオブジェクトの追加</li>
<li>テンプレートの選択</li>
<li>出力を生成するためにあなたのデータとテンプレートの「マージ」</li>
</ol>

<p>
<code>org.apache.velocity.app.Velocity</code>
クラスを経由でシングルトンパターンを使用するには、
コードでは、このようになります。
</p>

<source><![CDATA[
import java.io.StringWriter;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.ResourceNotFoundException; 
import org.apache.velocity.exception.ParseErrorException; 
import org.apache.velocity.exception.MethodInvocationException; 

Velocity.init();

VelocityContext context = new VelocityContext();

context.put( "name", new String("Velocity") );

Template template = null;

try
{
   template = Velocity.getTemplate("mytemplate.vm");
}
catch( ResourceNotFoundException rnfe )
{
   // テンプレートが見つからない
}
catch( ParseErrorException pee )
{
  // シンタックスエラー : テンプレートの解析時に問題発生
}
catch( MethodInvocationException mie ) 
{ 
  // テンプレートで何かが例外を投げた
} 
catch( Exception e )
{}

StringWriter sw = new StringWriter();

template.merge( context, sw );

]]></source>

<p>
これが、基本的なパターンです。
とっても単純ですね？
これは、通常あなたがテンプレートをレンダリングするのに Velocity を使うときに行なうことです。
あなたは多分必ずしもこのようにコードを書くことにはならならないでしょう−我々は servlet とアプリケーション・プログラマーの双方に対して、より簡単にするための 2 〜 3 のツールを用意しています。
このガイドの中で後ほど、我々は両方のサーブレットで一般的なアプリケーションと同様に Velocity を使うことについて説明します、そして、我々は我々がより簡単にするために提供するツールを検討します。
どちらの場合も上記のシーケンスがその舞台裏で動いているのは事実です。
</p>

  </section> 
    
   <section name="To Singleton Or Not To Singleton..."> 
    
   <p> 
   Velocity 1.2 からは、Velocity エンジンを使うにあたって、開発者は
シングルトンモデルかインスタンスモデルの分離の 2 つの選択肢があります。
どちらの方法も同じ Velocity コードのコアを使用し、
Velocity をより簡単にあなたの Java アプリケーションに統合することができます。
   </p> 
    
    
   <p> 
   <a name="Singleton"><strong>Singleton Model</strong></a> 
   </p> 
    
   <p> 
これは、レガシーなパターンですべての JVM(またはWebあぶりケーション依存) でひとつの
Velocity エンジンのインスタンスが共有されます。
これはリソースの共有とローカライズされた設定のためにはとても便利な方法です。
例えば、これはサーブレット 2.2 以降に互換の Web アプリケーションで使用するためには適切なモデルで、それぞれの Web アプリケーションは、独自の Velocity のインスタンスを持ち、
Web アプリケーションのサーブレットは、テンプレート、ログ、その他のリソースを共有します。
シングルトンは、<code>org.apache.velocity.app.Velocity</code> クラスからアクセス
することができ、以下のように使用します。
   </p> 
   <source><![CDATA[ 
    
   import org.apache.velocity.app.Velocity; 
   import org.apache.velocity.Template; 
    
   ... 
   /* 
    *  エンジンの設定 - 例として、我々のサーブレットはログを使用して
    *  いるのでログキング例を参照
    */ 
   Velocity.setProperty( Velocity.RUNTIME_LOG_LOGSYSTEM, this); 
   /* 
    *  ここで、エンジンを初期化
    */ 
   Velocity.init(); 
    
   ... 
    
   Template t = Velocity.getTemplate("foo.vm"); 
   ]]></source> 
    
   <p> 
   シングルトンモデルは、
   <code>org.apache.velocity.servlet.VelocityServlet</code> ベースクラスで
   使用され、ユーティリティクラスは、サーブレットを簡単に作成するために
   配布されることに注意してください。
このクラスを拡張することは Velocity を使っている servlets 
を書く最も共通で便利な方法ですが、
あなたが別な目的のためにこのクラスを使わないのは自由です。
   </p> 
    
   <p> 
   <a name="Separate"><strong>Separate Instance</strong></a> 
   </p> 
    
   <p> 
      バージョン 1.2 から、あなたは、同じJVM(またはWebアプリケーション)
で Velocity のインスタンスを多く
使用して、インスタンスを別々に作成し、設定することができます。これは、
テンプレートディレクトリや、ログ、その他を同じアプリケーションで
設定を分割したいときに役立ちます。分割インスタンスを使用するためには、
<code>org.apache.velocity.app.VelocityEngine</code> クラスを使用します。
上記のシングルトンの例と似たような例があります。
   </p> 
    
   <source><![CDATA[ 
    
   import org.apache.velocity.app.VelocityEngine; 
   import org.apache.velocity.Template; 
    
   ... 
    
   /*
    * 新たなエンジンのインスタンスを生成
    */
   VelocityEngine ve = new VelocityEngine(); 
   /*
    * エンジンの設定。この場合私たちのサーブレットは、
    * ログを使用します(ロギング例を参照..)
    */
   ve.setProperty( VelocityEngine.RUNTIME_LOG_LOGSYSTEM, this); 
   /*
    * エンジンを初期化
    */
   ve.init(); 
    
   ... 
    
   Template t = ve.getTemplate("foo.vm"); 
   ]]></source> 
    
   <p> 
ごらんのように、これはとてもシンプルで簡単なものです。
幾つかの単純な文法の変更で、
Velocity をシングルトンやインスタンス分割の要求のためにあなたのアプリケーションやテンプレートの高レベルの構造は変更する必要はありません。
   </p> 

  <p> 
プログラマーとして、クラスは、Velocity 内部と影響しあうものは、
もしシングルトンモデルを使用する場合には、
<code>org.apache.velocity.app.Velocity</code> で、
シングルトンモデル以外(「分割インスタンス」)を使用する場合には、
<code>org.apache.velocity.app.VelocityEngine</code> です。
   </p> 
   <p> 
アプリケーションで
<code>org.apache.velocity.runtime</code> パッケージにある
内部の
<code>Runtime, RuntimeConstants, 
   RuntimeSingleton or RuntimeInstance</code> クラスを
決して使わないでください。これらは内部使用のみを想定しており、そのうち変更されます。
上で言及されるように、あなたが使うはずであるクラスは <code>org.apache.velocity.app</code>
パッケージにある、<code>Velocity</code> と <code>VelocityEngine</code> クラスです。
何かが見つからないか、それらのクラスから必要ならば、
変更点を提案するのをためらわないでください−これらのクラスはアプリケーション開発者を対象とします。
   </p> 

</section>

<section name="The Context">

<a name="The Basics"><strong>The Basics</strong></a>
<p>
『コンテキスト』の概念は、Velocity にとって主要で、
システムの一部の間でデータのコンテナをまわりに移動することの共通のテクニックです。
その考え方は、コンテキストが Java 層の間のデータの『キャリヤー』であるということです（あるいは、あなたプログラマー）、そして、テンプレート層（またはデザイナー）。
プログラマーとしてのあなたは、いろいろなタイプ（あなたのアプリケーションが要求するものは何でも）のオブジェクトを集めることになって、コンテキストでそれらを置くことになります。
デザイナー、これらのオブジェクトと彼らのメソッドに、そして、プロパティは
<a href="vtl-reference-guide.html"> references</a> と呼ばれているテンプレート要素を通してアクセス可能になることになります。
通常、あなたはデータがアプリケーションのために必要とすると決定するデザイナーと働くことになります。
ある意味では、あなたがテンプレートでアクセスにデザイナーに設定されるデータを生産するので、これは『API』になることになります。
したがって、開発プロセスのこのフェーズで、それは若干の時間と慎重な分析を捧げる価値があります。
</p>


<p>
Velocity がサポート特別なニーズとテクニック（直接（例えば）LDAP サーバーにアクセスするコンテキストのような）にあなた自身のコンテキスト・クラスを作成するためにあなたを許すが、VelocityContext と呼ばれている良い基本の実装クラスは配布の一部としてあなたに対して用意されています。
</p>

<p>
VelocityContext は全ての一般的な目的ニーズにふさわしいです、
そして、我々はあなたがそれを使うことを強く推奨します。
例外的で高度な利用の場合のみ、あなたがあなた自身のコンテキスト実装を拡張するか、
つくる必要があります。
</p>

<p>
VelocityContext を使うことは、標準的な Java Hashtable なクラスを使用するのと、
同じくらい単純です。
インタフェースが他の役に立つメソッドを含むが、あなたが使うことになる 2つの主なメソッドはあります
</p>

<source><![CDATA[
public Object put(String key, Object value);
public Object get(String key);
]]></source>

<p>
Hashtable と同じように注意してください、値は java.lang.Object から派生しなければならず、
null ではいけません。
int または float のような基本タイプは、適切なラッパー・クラスで包まれなければなりません。
</p>

<p>
それは、実際には全てが基本のコンテキスト操作にあります。
詳細は、配布に含められる API ドキュメンテーションを見てください。
</p>


<p>
<a name="Support for Iterative Objects for #foreach()"><strong>Support for Iterative Objects for
#foreach()</strong></a>
</p>

<p>
プログラマーとして、あなたがコンテキストに置いたオブジェクトにおいて、
あなたは素晴らしい自由があります。
しかし、大部分の自由と同様に、これはほんの少しの責任もあるので、
Velocity がサポートするものと起こるかもしれないどんな生成物でも理解してください。
Velocity は、VTL <code>#foreach()</code> 指示子のために、
いくつかの適当なコレクション・タイプをサポートします。
</p>

<ul>

<li> <code>Object [] </code>規則的なオブジェクト配列（ここで言われる多くの必要でない）。
Iterator インタフェースを提供するクラスで、
Velocity は内部であなたの配列を包むことになります、しかし、
それはプログラマーまたはテンプレート著者としてあなたに関係するはずではありません。
</li>

<li> <code>java.util.Collection</code>  あなたがあなたのオブジェクトでコレクション・インタフェースを実装しているならば、Velocity はループにおいて使う Iterator をそうようにするために <code>iterator()</code> メソッドを使用することになります、
<code>iterator()</code> が働く Iterator を返すことを確認してください。
</li>

<li> <code>java.util.Map </code> ここでは、Velocity は <code>Collection</code>
インタフェースを得るためにインタフェースの <code>values()</code> メソッドに依存します。
そこでは、<code>iterator()</code>  はループのために Iterator を取り出すために呼ばれます。
</li>

<li> <code>java.util.Iterator</code> 使用上の注意: 
これは仮に現在サポートされるだけです−重要性の問題は Iterator の「非 resettablity」です。
『裸の』Iterator がコンテキストに置かれて、Iterator としての1つの #foreach() 
（第一の後のブロックが失敗することになる以降の #foreach()）がリセットしないより、
多くのものにおいて使われる。
</li>

<li> <code>java.util.Enumeration</code> の使用上の注意：
<code>java.util.Iterator</code> の様に、これは仮に現在サポートしているだけです−
重要性の問題は列挙の『非resettablity』です。
『裸の』列挙がコンテキストに置かれて、列挙としての1つの #foreach()（第一の後のブロックが失敗することになる以降の #foreach()）がリセットしないより、多くのものにおいて使われる。
</li>

</ul>

<p>
<code>Iterator</code> と <code>Enumeration</code> の場合、
それが避けられることができないときだけ、彼らがコンテキストで置かれることは推薦されます、
そして、それが十分で可能なとき、あなたは Velocity
を適切な再使用できる反復的なインタフェースを見つけさせるはずです。
</p>

<p>
直接 <code>java.util.Iterator</code> インタフェース
（例えば、JDBC を経由の大きなデータ・セット）を使用する良い理由があります、
しかし、それが避けられることができるならば、何か他を使うよりよいかもしれません。
『直接』に、我々は何かをすることを意味しました：
</p>

<source><![CDATA[
Vector v = new Vector();
v.addElement("Hello");
v.addElement("There");

context.put("words", v.iterator() );
]]></source>

<p>
ここで、Iterator がコンテキストに置かれるところ。
その代わりに、あなたが単に行います：
</p>

<source><![CDATA[
context.put("words", v );
]]></source>

<p>
それから、全ては洗練された：
Velocity はその（リスト経由で）Vector 実装コレクションを理解して、したがって、
<code>iterator()</code> メソッドを見つけることになります、そして、
各時その使用のために『新しい』Iterator のためにそれを得るそれが必要とする使用はそうします。
普通の Iterator だけで（...より上の最初の切れっぱし）一旦 velocity が
<code>#foreach()</code> でそれを使うならば、Velocity にはそれが使われる次の
<code>#foreach()</code> の用途に、新しいものを得ることの方法がありません。
結果は、そのリファレンスを使っている少しの以降の <code>#foreach()</code>
ブロックからもの出力ではありません。
</p>

<p>
上のこれは、Velocity でコレクションについて繰り返すことは素晴らしい心配を必要として、
考えた何かであるという印象を与えるはずではありません。
むしろ、一般に、正反対は真実です。
あなたがコンテキストに Iterator を置くとき、慎重にするだけでください。
</p>

<a name="Context Chaining"><strong>Context Chaining</strong></a>

<p>
Velocity のコンテキスト・デザインの革新的な機能は、<i>context chaining</i> の概念です。
また、時々 <i>context wrapping</i> と呼ばれて、この先進の機能は、
それをテンプレートに1つの「隣接する」コンテキストとして現れさせる方法において、
一緒に別々のコンテキストを接続するためにあなたを許します。
</p>

<p>
これは、例で一番良く示されます：
</p>

<source><![CDATA[
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 );
]]></source>

<p>
上のコードにおいて、我々は上に向かう context2 にそれが context1 を
<i>chains</i> するようなものを課しました。
テンプレートでのそれ、あなたがそうすることができるこの手段少しもオブジェクトを加えるために使われるキーの重複がない限り、2つの VelocityContext オブジェクトのどちらにでも入れられたアイテムのアクセス。
それが場合であるならば、そのままに重要な「複製」のためにより上に、
チェーンにおいて最も近いコンテキストで保存されるオブジェクトは利用できることになります。
上のこの例で、オブジェクトは「I am in context2」という文字列が返される。
</p>

<p>
この重複または「covering」がコンテキスト・アイテムの少しの方法にもおいてしないという注意は、おおわれたオブジェクトを害するか、変えます。
上の例でそうストリング「私は、context1でいます」生きてよくcontext1.get("duplicateを通してさらにaccessableである」）。
上の例で以外、テンプレートでのリファレンス『$duplicate』の値はす『私は、context2でいます』、そして、テンプレートはおおわれたひもにアクセスをしません『私は、context1でいます』。
</p>

<p>
あたなは情報をあなたがそうすることになるコンテキストに加えるためにテンプレートに頼っている時が翻訳の後のそれ以後を調べるように注意しなければならない点にまた、注意してください。
テンプレートでの <code>#set()</code> ステートメントを経たコンテキストへの変更点は、
外のコンテキストだけに影響を及ぼすことになります。
それで、テンプレートからデータが内部のものの上へ置かれたのを期待して、
あなたが外のコンテキストを捨てないことを確認してください。
</p>

<p>
この機能は多くの使用を持ちます、
最も共通のものはこれまで提供している階層化されたデータ・アクセスと toolsets です。
</p>

<p>
前に言及されるので、このガイドの現在の範囲を越えて以外、Velocit yコンテキスト仕組みはまた、
拡張可能です。
あなたが興味を起こすならば、提供されたコンテキストがどのようにまとめられるかについて見るために、パッケージ <code>org.apache.velocity.context</code> でクラスを見てください。
しかし、メモリサポートとしてデータベースを使う[ goofy ]
ものを含む交互の実装を示す配布において、2、3の例が、<code>examples/context_example</code>
ディレクトリにあります。
</p>

<p>
に注目してください、これらの例は、サポートされていなくて、デモンストレーション/教育的な目的だけのためにそこにあることに注意してください。。
</p>


<a name="Objects Created in the Template"><strong>Objects Created in the
Template</strong></a>

<p>
Java コードがオブジェクトを扱わなければならないところがつくった2つの共通の状況が、
テンプレートで実行時にあります：
</p>

<p>
テンプレート作者が Java コードによってコンテキスト内に位置する
オブジェクトのメソッドを呼び出すとき
</p>
<source><![CDATA[
#set($myarr = ["a","b","c"] )
$foo.bar( $myarr )
]]></source>

<p>
テンプレートはオブジェクトをコンテキストに加えるとき、
Java コードはそれらのオブジェクトにアクセスすることができ、その後マージ処理が完了します。
</p>

<source><![CDATA[
#set($myarr = ["a","b","c"] )
#set( $foo = 1 )
#set( $bar = "bar")
]]></source>

<p>
これらの場合を扱うには、とても単純で2、3の事柄を知っていればよい:
</p>

  <ul>
<li>
コンテキストで置かれるか、メソッドにパスされるとき、VTL 範囲オペレータ [ 1..10 ] と ObjectArray [「a」（b）」] は <code>java.util.ArrayList</code> オブジェクトです。
したがって、テンプレートでつくられる配列を受け入れるようにできているあなたのメソッドは、これを考慮して書く必要があります。
</li>

<li>
数字はコンテキストでの Integer になります、そして、もちろん、文字列は Strings になります。
</li>
<li>
Velocityはメソッド呼び出しに正しくargsを『狭くする』ので、<code>#set()</code>を通してコンテキストに置かれるintで<code>setFoo( int i )</code>を呼ぶことはきれいに動作することになります。
</li>

  </ul>

<a name="Other Context Issues"><strong>Other Context Issues</strong></a>

<p>
VelocityContext（またはAbstractContextに由来するどんなコンテキストでも）によって提供される機能のうちの1つは、キャッシュしているノード特定のイントロスペクションです。
一般にあなた開発者あなたのコンテキストとして VelocityContext を使うとき、
これについて心配する必要がありません。
しかし、この機能のについて知っておいて欲しい既知の使い方のパターンがあります。
</p>

<p>
それがノードを訪問するので、VelocityContext はテンプレートで構文ノードに関するイントロスペクション情報を蓄積することになります。
そして、以下の状況では：
</p>

<ul>
<li>
あなたは、同じ VelocityContext を使っている同じテンプレートの上に、
オブジェクトを繰り返しています。
</li>

<li>
Template キャッシュはオフです。
</li>

<li>
あなたはイテレートごとの getTemplate() からの Template を要求します。
</li>

</ul>

<p>
あなたの VelocityContext がメモリ「リーク」（それは、本当に集まっているより多くのイントロスペクション情報だけです。）をするように見えることになることはあり得ます
起こることはそれが訪問する各テンプレートのために、それがテンプレート・ノード introspection情 報を蓄積するということです、そして、キャッシュしているテンプレートが離れてそうであるので、それが各時新しいテンプレートを訪問していることは VelocityContext に現れます。
それゆえに、それはより多くの introspection 情報を集めて、成長します。
あなたが以下のうちの1つ以上をすることを特に推奨します。:
</p>

<ul>
<li>
テンプレート・レンダリング・プロセスによって軌跡を下っていく毎に新しい VelocityContext
を作成してください。
これは、イントロスペクション・キャッシュ・データの蓄積を防ぐことになります。
あなたが VelocityContext を再利用したい場合のために、データまたはオブジェクトで住みます、
あなたは単に住まれた VelocityContext を中で包むことができます別の、
そして、『外の』ものは introspection 情報を蓄積することになります。
そして、あなたはそれを捨てることになるだけである。
Ｘ。
<code>VelocityContext useThis = new VelocityContext( populatedVC ;</code>
この作業外のコンテキストがそうすることになる、ストア introspection が、
データをキャッシュして、内部のコンテキスト（そのままに空にしてください。）から、
どんな要請されたデータでも得ます
慎重です−コンテキストとそれへのあなたのテンプレート立場データがそうな、それが以降の繰り返しにおいて使われることになることを予想します、あなたは他のうちの1つをする必要があることになりますどんなテンプレート#set()ステートメントでも最も外部のコンテキストに保存されることになるので、修理します。
詳細は<a href="developer-guide.html#Context Chaining">Context chaining</a>で議論を見てください。
</li>

<li>
テンプレートキャッシュを ON の場合。これは、ぞぞれのイテレーションごとに
再解析からテンプレートを防止することになりますが、その結果として
introspection キャッシュ情報を増すことを避けるだけでなくて、
それを使うことができもすることができる VelocityContext
パフォーマンスの改良ができます。
</li>

<li>
テンプレート・オブジェクトをループ繰り返しの継続期間に再生利用してください。
それから、Velocity に強制しようとしないときに、
キャッシュがオフならば、
同じテンプレートを何度も再読み込みと再解析するために、
VelocityContext は、毎回同じ introspection 情報を集めるようにしません。
</li>

</ul>

</section>

<section name="Using Velocity In Servlets">

<a name="Servlet Programming"><strong>Servlet Programming</strong></a>

<p>
Velocity の最も一般的な利用は、WWW のための Java Servlet プログラミングの領域です。
Velocity がこの作業のために最適な理由がたくさんあります。
そのうちの大きな理由のひとつは、Velocity のコード層からのプレゼンテーション層(またはVIEW)の
分離の励行です。
このことについては、
<a href="http://www.javaworld.com/javaworld/jw-12-1999/jw-12-ssj-jspmvc.html"> これ</a>に多くのリソースがふくまれています。
</p>

<p>
servlet 環境においてVelocityを使う基本テクニックは、非常に単純です。
ごく狭い場所で、あなたがしなければならない全ては、提供された VelocityServlet
ベース・クラスを 拡張して、ひとつのメソッド（<code>handleRequest()</code>）
を実装するだけです。
それは、本当にあなたの servlet 開発において Velocity
を使うことを要求される全てです。
</p>

<p>
Velocity 1.1 では、2つの <code>handleRequest()</code> メソッドが、あります：

<br/>
<br/>

<i><code>public Template handleRequest( Context )</code></i>
  
 <blockquote>
これは、2つのメソッドの古い方です。
このメソッドは、あなたが有効なテンプレート・オブジェクトを返すことを必要とします。
有効でなかったり、<code>null</code> だったりすると、これはエラーと見なされて、
その結果として <a href="developer-guide.html#error()"><code>error()</code></a> エラー
ハンドリングメソッドが呼び出されます。
必要であれば、あなたは <code>error()</code> をオーバーライドできます。
<code>null</code> を返すときに、なにか期待する動作をさせたい場合
(例えば、あなたは要求を向け直したいとか)の場合には、
次に説明するより新しいメソッドを使用することが推奨されます。
</blockquote>

<i><code>public Template handleRequest( HttpServletRequest, HttpServletResponse, Context )</code></i>

<blockquote>
これは2つの <code>handleRequest()</code> メソッドのより新しいものです。
そして、バージョン 1.1 において実装されます。
このメソッドとの違いは、<code>Context</code> と同じように、
<code>HttpServletRequest</code> と <code>HttpServletResponse</code>
オブジェクトがメソッドに対する引数としてあなたに渡されるということです。
他の違いはこのメソッドが全ての処理がメソッドによって取り扱われたことを明らかにするために
<code>null</code> を返すことができるということです、そして、その Velocity
は呼び出し <a href="developer-guide.html#requestCleanup()"><code>requestCleanup()</code></a> 以外は何もしません。
そして、あなたは、例えば、要求をリダイレクトしたいという場合には、
これはとても役に立ちます。
</blockquote>

いつものように、最も確実で最新の注意事項のためには、
Javadoc API ドキュメンテーションを参照してください。
</p>

<p>
以下のコードは、例ディレクトリにおいて配布に含められる SampleServlet.java クラスと
同じ物です。
</p>

<source><![CDATA[
public class SampleServlet extends VelocityServlet
{
    public Template handleRequest( HttpServletRequest request, 
                                   HttpServletResponse response, 
                                   Context context )
    {

        String p1 = "Jakarta";
        String p2 = "Velocity";

        Vector vec = new Vector();
        vec.addElement( p1 );
        vec.addElement( p2 );

        context.put("list", vec );

        Template template = null;

        try
        {
            template =  getTemplate("sample.vm");
        }
        catch( ResourceNotFoundException rnfe )
        {
          // couldn't find the template
        } 
        catch( ParseErrorException pee )
        {
          // syntax error : problem parsing the template
        }
        catch( Exception e )
        {}

        return template;
    }
}
]]></source>

<p>
見覚えがありますか？
コンテキスト・オブジェクトを作成することを除いては、VelocityServlet ベースクラスによってあなたのために完了していますまた、VelocityServlet ベースクラスによってあなたのために merge() ステップを行います、これは我々がこのガイドの初めに言及した基本的なコード・パターンと同じです。
我々は、コンテキストを取り出し、我々のアプリケーション・データを加えて、テンプレートを返します。
</p>

<p>
<code>handleRequest()</code>メソッドに渡されるデフォルトの<code>Context</code>オブジェクトは、現在の<code>HttpServletRequest</code>と<code>HttpServletResponse</code>オブジェクトを含みます。
これらは、コンテキストで置かれて、定数 <code>VelocityServlet.REQUEST</code>（値=『req』） と
<code>VelocityServlet.RESPONSE</code>（値=『res』）を使います。
あなたの Java コードにおいてアクセスするためには、これらのオブジェクトを使用します：
</p>

<source><![CDATA[
public Template handleRequest(  Context context )
{
    HttpServletRequest request =  (HttpServletRequest) context.get( REQUEST );
    HttpServletResponse response =  (HttpServletResponse) context.get( RESPONSE );

   ...
]]></source>

<p>
そして、あなたのテンプレート:
</p>

<source><![CDATA[
#set($name = $req.getParameter('name') )
]]></source>

<p>
より高度な使い方として、VelocityServlet ベース・クラスは、
要求処理を取り扱うことの一部をオーバーライドすることが可能です。
以下のメソッドは、オーバーライドすることができます：

<br/>
<br/>

<i><code> Properties loadConfiguration( ServletConfig )</code></i>
<blockquote>
標準的な設定の仕組みをオーバーライドし、追加、変更や設定プロパティ設定をすることができます。
これは、実行時に webapp root に絶対パスをセットしたり、オーバーライドするか、
テンプレートとログ・パスを増やすことに役立ちます。
</blockquote>

<i><a name="createContext()">
<code>Context createContext(HttpServletRequest, HttpServletResponse )</code></a></i>
<blockquote>
あなた自身コンテキスト・オブジェクトを作成することができるようにします。
これは、例えば連鎖をしたり、ツールやデータで事前ロードしたりといった
より高度な技術を許します。
デフォルトの実装では、単に要求された VelocityContext オブジェクトを返し、
応答オブジェクトは内部を置きます。
若干のservletコンテナ実装で occurr な要求と応答オブジェクトは、
それがそうするかもしれない introspection 問題を避けるために単純なラッパー・クラスで包まれてあります。
あなたは通常要求と repsponse オブジェクトを使用することができます。
そして、テンプレートからのどちらでものメソッドにアクセスします。
それがあなたにとって重要ならば、それら特に javax.servlet.XXXX でないという注意。
</blockquote>

<i><code>void setContentType( HttpServletRequest,HttpServletResponse )</code></i>
<blockquote>
要求を調べて、要求またはクライアントに依存した、
あなた自身の content-type を設定することができます。
プロパティにおいて指定されないならば、
デフォルトの実装は、velocity.properties に指定した値かそれが無ければ
デフォルトで「text/thml」が設定されます。
</blockquote>

<i><code>void mergeTemplate( Template, Context, HttpServletResponse )</code></i>
<blockquote>
出力ストリームを生成するためにあなたを許します。
VelocityServlet は非常に効率的な Writer クラスのプールを使いますので、
これは、たいてい特別な状況においてオーバーライドされます。
</blockquote>

<i><a name="requestCleanup()"><code>void requestCleanup( HttpServletRequest, 
  HttpServletResponse , Context )</code></a></i>
<blockquote>
要求処理の終わりに、クリーンアップまたはリソース再利用でもどんなことでも
するためにあなたを許します。
デフォルトは、何もしません。
</blockquote>

<i><a name="error()"><code>protected void error( HttpServletRequest, 
  HttpServletResponse, Exception )</code></a></i>
<blockquote>
要求処理での例外発生時に呼ばれるエラー・ハンドラー。
デフォルトの実装は、ユーザーへスタックトレースと例外情報の
単純な HTML メッセージを送ることになります。
クライアント・メッセージとより高度な問題取り扱いを
カスタマイズするためにオーバーライドします。
</blockquote>

詳細情報は、Javadoc
<a href="apidocs/index.html">API ドキュメント</a>
を見てください
</p>

<a name="Deployment"><strong>Deployment</strong></a>

<p>
あなたがあなたの Velocity ベースの servlets を配備するとき、
あなたは確かにあなたのプロパティ・ファイルが Velocity 実行時に
設定するために使われることを確実にしたいことでしょう。
Tomcatの下で、これを達成する1つの方法があなたの Webアプリ（webapps/appname）
の root ディレクトリに、あなたの velocity.properties ファイルを置くこと、
それから、以下をあなたの Web-INF/web.xml ファイルに加えてください：
</p>

<source><![CDATA[
<servlet>
  <servlet-name>MyServlet</servlet-name>
  <servlet-class>com.foo.bar.MyServlet</servlet-class>
  <init-param>
      <param-name>properties</param-name>
      <param-value>/velocity.properties</param-value>
  </init-param>
</servlet>
]]></source>

<p>
全てが正しいと仮定して、MyServlet がロードされるとき、その内部のデフォルトに依存するよりも、それ自体で初期化するために velocity.properties ファイルを使用する方が確実なります。
</p>

<p>
注意: Velocity がそれの中心のコア Runtime クラス用に singleton モデルを使うので、
それを CLASSPATH または servlet ランナーの最上位の lib ディレクトリに置くというゆうむしろ、
Webアプリケーションクラスローダーがあなたの実行時インスタンスを管理するのを確実にするために、Velocity を使用するすべての Web アプリケーションの Web-INF/lib ディレクトリに velocity-XX.jar を置くのは非常に良い考えです。
</p>

<p>
この配備方法は、異なる Web アプリケーションが Velocity 構成の衝突回避を確実にします。
</p>

</section>

<section name="Using Velocity In General Applications">

<p>
Velocity は汎用的に使用できるツールとして設計されたので、
それは一般的なアプリケーション・プログラムでそれが servlets であるのと、
同じくらい役に立ちます。
一般に、あなたはこのガイドの初めに検討されたのと同じプログラミング・パターンを使うことができますが、我々が簡単に使用できるように VelocityServlet ベースクラスを提供したのと同様に、
アプリケーション使用に対して2、3のユーティリティ・メソッドが用意されているます。
あなたがアプリケーション・プログラマーとして持つ唯一の新しい責任は Velocity 実行時エンジンを初期化することです、しかし、それは簡単です。
</p>

<a name="The Velocity Helper Class"><strong>The Velocity Helper Class</strong></a>

<p>
Velocity は、Velocity（<code>org.apache.velocity.app.Velocity</code>）と呼ばれているアプリケーション・ユーティリティ・クラスを含みます。
このクラスの目的は、Velocity（Velocityを使う際により簡単にする役に立つユーティリティ・ルーチンと同様に）を初期化することを要求される必要なメソッドを提供することです。
このクラスはプロジェクトの javadoc で文書化されますので、完全な詳細は、それを参照してください。
このドキュメンテーションは、本質的にはチュートリアルのつもりです;
したがって、API 情報と重複しますが、Javadoc は最終的な情報源となります。
</p>

<p>
Velocity 実行時エンジンはリソースを提供する singleton インスタンスです。
そして、全ての Velocity ユーザーに対するロギングと他のサービスは同じ JVM で実行します。
したがって、実行時エンジンは、一度だけ初期化されます。
あなたは一度ならず Velocity を初期化しようとすることができます、
しかし、最初の初期化だけが適用されます。その他の初期化の試みは、無視されます。
Velocity ユーティリティ・クラスは、現在実行時エンジンの構成で使用される
5つのメソッドを提供します。
</p>

<p>
5つの設定メソッドがあります
</p>

<ul>

<li><code>setProperty( String key, Object o )</code><br />  
プロパティ<code>key</code>に値<code>o</code>を設定します。
値は、一般的に String です、しかし、値のコンマで区切られたリストが、
特別な場合においてまた、あることがありえます（ひとつの String 内で例えば、
"foo, bar, woogie"）起こることになる他のものと同じくらいよい。
</li>

<li><code>Object getProperty( String key )</code><br /> 
プロパティ・キーの値を返します。
注意: それらは String 以外のものでありえるので、あなたは戻り値のタイプを
知っていなければなりません。
</li>

<li><code>init()</code><br /> 
配布において提供されるデフォルトのプロパティによる実行時を初期化します。
（これらは、プロパティに関連するセクションの中の下でリストされます。）
</li>

<li><code>init( Properties p )</code><br />
引数として渡される<code>java.util.Properties</code>オブジェクトに含まれるプロパティで、
実行時に初期化します。</li>

<li><code>init( String filename )</code><br /> 
プロパティを使っている実行時がプロパティ・ファイル・ファイル名で見つけた
プロパティで実行時に初期化します
</li>
</ul>

<p>
注意: それぞれの場合、デフォルトプロパティは、基底の設定として使用され、
独自の値が、デフォルトのプロパティに上書きされます。
つまり、オーバーライドされないどんなデフォルトのプロパティでも、
実質的に残ることになります。
これは、完全なセットよりむしろあなたが変更したい部分のプロパティだけ
指定できるという利点があります。
</p>

<p>
その他の注意点は、 <code>init()</code> 呼び出しは、
アプリケーションに悪影響を与えずに一度以上実行される可能性があることです。
しかし、<code>init()</code> 機能のいずれかへの最初の呼び出しは、
そこでセットされる構成プロパティで、エンジンを構成することになり、
そして、どんな更なる構成変更点でもまたは <code>init()</code>
呼び出しは無視されます。
</p>

<p>
Velocity を初期化するのに最も共通の方法は、このようになります：
</p>

<ol>
<li>
あなたが望む設定値を org/apache/velocity/runtime/defaults/velocity.properties（デフォルトのセット）と同じフォーマットの中のファイルに置くか、または <code>java.util.Properties</code>において、それから <code>init( filename )</code> または <code>init( Properties )</code> を呼び出します。
</li>

<li>
<code>setProperty()</code> を個々に使って設定値をセットしてください、それから、
<code>init()</code> を呼んでください。
このメソッドが、一般にすでに彼ら自身の構成管理システムを持つようなより高度なアプリケーションによって使われます
−
これは、例えばそれが実行時に生成する値に基づく Velocity を設定するようなアプリケーションを許します。
</li>

</ol>

<p>
一旦、実行時に初期化されるならば、あなたはそれであなたが願うものをすることができます。
これは大部分は出力ストリームにテンプレートをレンダリングする周囲を循環します。
そして、Velocity ユーティリティ・クラスは簡単にこれをするためにあなたを許します。
現在、メソッドとそれらがするものの簡潔な説明は、ここにあります：
</p>

<ul>
  <li>
     <code> evaluate( Context context,  Writer out, String logTag, 
     String instring )</code><br/>
     <code>evaluate( Context context, Writer writer, String logTag, 
     InputStream instream )</code><br/>
これらのメソッドは、
String 形式か 出力 Writer への InputStream において、あなたが提供するコンテキストを使って、入力をレンダリングします。
これは、文字列のトークン置換や、データベースのようにVTLを含んだ内容の
「テンプレート」を保持したり、その他のファイル以外の格納をしたり、
動的に作成したりするために使うには非常に便利なメソッドです。
  </li>

  <li>
    <code>invokeVelocimacro( String vmName, String namespace, String params[], 
    Context context, Writer writer )</code><br />
Velocimacros への直接のアクセスを許します。
あなたが望むならば、これはまた、上の <code>evaluate()</code> メソッドによって完成していることがありえます。
ここでは、あなたは単にあなたが呼ばれることを望むvmに名をつけ、
VMに渡す引数の配列、データの Context、出力のための Writer を作成します。
注意: VM 引数はコンテキスト（arg.として使われる文字通りのデータよりむしろ）でのデータ・オブジェクトの『キー』でなければなりません。
これは、多分変わることになるでしょう。
  </li>

  <li>
    <code>mergeTemplate( String templateName, Context context, Writer writer )
    </code><br />
標準的なテンプレートのハンドリングと Velocity のレンダリング・サービスへの便利なアクセス。
このメソッドは、テンプレートを得て、レンダリングすることの世話します。
それは、ファイル・リソース・ローダーのためにプロパティ設定によってテンプレートをロードすることを利用することになって、したがって、ファイルの利点を提供して、その Velocity 申し込みをキャッシュしているテンプレートを解析しました。
あなたが特別なニーズを持たない限り、これはアクセス・テンプレートに最も効率的な方法であって、推薦されます。
  </li>

  <li>
    <code> boolean templateExists( String name ) </code><br />
テンプレート <code>name</code> が現在設定されたリソース・ローダーで見つけることができるかどうか判断します。
  </li>

</ul>

<p>
一旦我々がこれらの基本のヘルパーを知るならば、Velocity を使う Java プログラムを書くことは簡単です。
ここでは、：
</p>

<source><![CDATA[
import java.io.StringWriter;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.VelocityContext;

public class Example2
{
    public static void main( String args[] )
    {
        /* まずは、実行時エンジンを初期化する。デフォルトでよい。 */

        Velocity.init();

        /* Context を作成して、それにデータを入れる */

        VelocityContext context = new VelocityContext();

        context.put("name", "Velocity");
        context.put("project", "Jakarta");

        /* テンプレートをレンダリングする */

        StringWriter w = new StringWriter();

        Velocity.mergeTemplate("testtemplate.vm", context, w );
        System.out.println(" template : " + w );

        /* レンダリング用に独自の文字列を作成する */

        String s = "We are using $project $name to render this.";
        w = new StringWriter();
        Velocity.evaluate( context, w, "mystring", s );
        System.out.println(" string : " + w );
    }
}
]]></source>

<p>
我々は、このプログラムを実行して、我々のプログラム（我々がデフォルトの構成プロパティを使ったので、テンプレートをロードする場所は現在のディレクトリです）と同じディレクトリにおいて、テンプレート <code>testtemplate.vm</code> を持ちます、我々の出力は、こうなるはずです：
</p>

<source><![CDATA[
template : Hi!  This Velocity from the Jakarta project.

string : We are using Jakarta Velocity to render this.
]]></source>

<p>
そこで我々が使ったテンプレート（testtemplate.vm）は
以下のようになります。
</p>

<source><![CDATA[
Hi!  This $name from the $project project.
]]></source>

 <p>
これでここにあるもの全てです!
我々のプログラムで<code>mergeTemplate()</code>と<code>evaluate()</code>
を使う必要はなかったことに注意。
それには、デモンストレーション目的のために両方とも含まれます。
あなたは多分メソッドのうちの1つだけを使うことになるでしょう、
アプリケーション必要条件以外は、あなたがやりたいようにして構いません。
</p>

<p>
これはこのガイドの初めに言及された『基本的パターン』と少し異なるように見えます、
しかし、それは本当に同じものです。
最初に、あなたはコンテキストを作って、それを必要とされるデータで満たしています。
そこで、この例で異なっているのは、<code>mergeTemplate()</code> を使用して
いる部分す。<code>mergeTemplate()</code> は、Runtime クラスの低レベルの呼び出しを
利用して、あなたのためにテンプレートの取得とマージを行なっています。
第二の例では、あなたが String 経由で動的にあなたのテンプレートを作っていること、
そのため、処理の部分で『テンプレートを選びます』のためのanalgousで、
<code>evaluate()</code> メソッドの一部は、あなたのために
低レベルの呼び出しを使ってマージを行ないます。
</p>

<p>
それで、上記の例はVelocityテンプレートエンジンを使用するパターンを単純な
ままにしていますが、ユーティリティ機能が繰り返しのコツコツした作業や、その他のテンプレートファイルの内容をテンプレートにするオプションなど行なっています。
</p>

<a name="Exceptions"><strong>Exceptions</strong></a>

<p>
Velocity が、解析/マージのサイクルで投げることになる3つの例外があります。
また、I/O の問題、その他からやって来ることになる例外がこれに追加されます。
それらは、パッケージ <code>org.apache.velocity.exception</code> で見つけられます：
</p>

<ol>
<li>
<code>ResourceNotFoundException</code><br />
リソース管理システムが要請されたリソース（テンプレート）を見つけることができない時に投げられます。
</li>

<li>
<code>ParseErrorException</code><br />
リソース（テンプレート）を解析するとき、VTL 構文エラーが発見された時に投げられます。
</li>

<li>
<code>MethodInvocationException</code><br />
レンダリング時にコンテキスト内のオブジェクトのメソッドで例外を投げられました。
この例外は、アプリケーションに投げられた例外と propogates にそれをラップします。
これは、実行時であなた自身のオブジェクトにおいて問題を取り扱うためにあなたを許します。
</li>

</ol>

<p>
それぞれの場合、メッセージは実行時ログに入れられます。
詳細は、Javadoc API ドキュメンテーションを見てください。
</p>

<a name="Miscellaneous Details"><strong>Miscellaneous Details</strong></a>

<p>
The latter method is convenient, because you can either fill it directly 
from a separate properties file via the <code>load()</code>  method, or even 
better, you can fill it dynamically from your own application / framework's 
property set at runtime.  This gives you the freedom to combine all of the 
properties for your app into one properties file.
</p>
<p>
上記の例がデフォルトのプロパティを使ったが、あなた自身のプロパティをセットすることは非常に単純です。
あなたがしなければならない全ては、どこかにプロパティ・ファイルを作って、そして、Velocity ユーティリティ・クラスの <code>init(String)</code> メソッドへそのファイルの名前を渡す、または <code>java.util.Properties</code> オブジェクトを作って、要求されたプロパティと値を加えて、そして、<code>init(Properties)</code> メソッドへそれを渡します。
後者のメソッドは便利です、あなたがそうすることができる、両方の一杯直接 <code>load()</code> メソッドによる別々のプロパティ・ファイルからそれ、あるいは、よりよく、あなたは実行時でセットされるあなた自身のアプリケーション/フレームワークのプロパティから動的にそれを満たすことができます。
これは、あなたに1つのプロパティ・ファイルにあなたのアプリのためにプロパティの全てを結合する自由を与えます。
</p>

<p>
我々がテンプレートフォームをロードするのにカレントディレクトリではなく、
異なるディレクトリを使いたい場合には、このようにします：
</p>

<source><![CDATA[
 ...

import java.util.Properties;
 ...

public static void main( String args[] )
{
    /* まずは、実行エンジンを初期化する  */

    Properties p = new Properties();
    p.setProperty("file.resource.loader.path", "/opt/templates");
    Velocity.init( p );

    /* Contextを作ってデータを入れる */

 ...
]]></source>

<p>
そして、ディレクトリ <code>/opt/templates</code> があり、そこにテンプレート <code>testtemplate.vm</code> があると仮定すると、これはうまく動きます。
あなたがこれを試して、問題を持つならば、必ず情報については velocity.log を見るようにしてください−エラー・メッセージは何が間違っているかについて理解するためにかなり役立ちます。
</p>

</section>

<section name="EventCartridge and Event Handlers">

<p>
バージョン 1.1 から、Velocity にきめの細かいイベントハンドリングシステムが追加されました。
EventCartridge は、あなたのイベントハンドラーを登録たり、必要であればマージするときに
イベントハンドラにアクセスすることができるクラスです。
現在、3つのイベントを扱うことができ、それらは <code>org.apache.velocity.app.event</code>
パッケージで見つけられます。
</p>

<p>
<i><code>org.apache.velocity.app.event.NullSetEventHandler</code></i>

<blockquote>
#set() の結果 null が割り当てられたとき、これは通常ログに記録されます。
<code>NullSetEventHandler</code> は、この状態のロギングを'禁止'するとができます。
<br/>
<pre>
public interface NullSetEventHandler extends EventHandler
{
    public boolean shouldLogOnNullSet( String lhs, String rhs );
}   
</pre>
</blockquote>

<i><code>org.apache.velocity.app.event.ReferenceInsertionEventHandler</code></i>
<blockquote>

<code>ReferenceInsertionEventHandler</code> は、出力時のストリームと
修正のためにリファレンス($foo)値の
書き出し時にぞぞれ割り込みを開発者に許可します。

<pre>
public interface  ReferenceInsertionEventHandler extends EventHandler
{
    public Object referenceInsert( String reference, Object value  );
}
</pre>
</blockquote>

<i><code>org.apache.velocity.app.event.MethodExceptionEventHandler</code></i>
<blockquote>
ユーザから提供される例外が投げられるとき、
<code>MethodExceptionEventHandler</code> は、Class、メソッド名、投げられた
例外とともに実行されます。ハンドラーは、メソッド呼び出しの値を戻すのに
使われる有効なオブジェクトを戻すか、ユーザに通知するためのラップした
あらたな例外 <code>MethodInvocationException</code> を投げます。

<pre>
public interface MethodExceptionEventHandler extends EventHandler
{
    public Object methodException( Class claz, String method, Exception e )
         throws Exception;
}
</pre>
</blockquote>
</p>

<p>
<strong>Using the EventCartridge</strong>
</p>

<p>
EventCartridge の使用方法はとても簡単です。
以下の省略された例は、<code>org.apache.velocity.test.misc.Test</code>
を参照しています。
</p>

<source><![CDATA[
 ...

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クラスの実装では、イベントハンドラインタフェースを
         * サポートするように正しくメソッドが実装されてると仮定します。
         * これらを使うにはまず、cartridge を新しく作ります。
         */
        EventCartridge ec = new EventCartridge();
         
        /*
         * そして、このクラスをそのハンドラーに収容するように登録します
         */
        ec.addEventHandler(this);
           
        /*
         * それから、最後に context を自身に追加します。
         */
        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;
    }
}
]]></source>

</section>

<section name="Velocity Configuration Keys and Values">

<p>
Velocity の実行時構成は、下でリストされる構成キーの集合によって制御されます。
通常、これらのキーは、値を持ち、それらは、String、コンマで区切られた String のリスト、
CSV と呼ばれるコンマで区切られた値です。
</p>

<p>
デフォルト値の設定は、Velocity の jar に含まれており、
/src/Java/org/apache/velocity/runtime/defaults/velocity.defaults にあり、
これは Velocity を使うための設定の元になります。
これは Velocity が常にそれのために「正しい」値を持つことになることは起動時に構成キーであることを確実にします、しかし、それはあなたが欲しいものでないかもしれません。
</p>

<p>
init() 実行以前に指定されるどんな値でも、デフォルトの値を置換します。
したがって、あたなが変更したいキーの値のみを変更すればよく、残りは
気にする必要はありません。さらに、我々はさらに多くの機能と設定を追加
をいきますが、あなたは自分の設定ファイルを変更する必要はありません。
Velocity エンジンは、常にデフォルト値を持ちます。
</p>

<p>
設定 API についての詳細は上のセクション
<a href="developer-guide.html#Using
Velocity In General Applications"><b>Using Velocity In General
Applications</b></a> を参照してください。
</p>

<p>
Velocity の挙動を制御する構成キーは、下でリストされます。
カテゴリーによって組織化します、各キーはそれでリストされてす。
そして、現在のデフォルトは「=」記号の右辺の値です。
</p>

<p>
<strong>Runtime Log</strong>
</p>

<p>
<code>runtime.log = velocity.log</code><br />
エラー、警告と情報を提供するメッセージのためのログ・ファイルのフルパスと名前。
絶対パスでければ、位置は「現在のディレクトリ」の相対パスとなります。
</p>

<p>
<code>runtime.log.logsystem</code><br />
このプロパティには、デフォルトの値がありません。
Velocity にインタフェース <code>org.apache.velocity.runtime.log.LogSystem.</code> で
サポートするロギングのクラスのインスタンス・インスタンスを与えるのに使われます。
そして、それはあなたの他のアプリケーション付きのメッセージがロギングするログが送る
Velocity の組合せを許します。
詳細は、
<a href="developer-guide.html#Configuring the Log System">Configuring the Log System</a> 
セクションを見てください。
</p>

<p>
<code>runtime.log.logsystem.class = 
org.apache.velocity.runtime.log.AvalonLogSystem</code><br/>
Velocity-instantiated ログシステムのために使用されるクラスです。
</p>

<p>
<code>runtime.log.error.stacktrace = false</code><br/>
<code>runtime.log.warn.stacktrace = false</code><br/>
<code>runtime.log.info.stacktrace = false</code><br/>
trueにすると、これらのエラーカテゴリーのスタックトレースを有効にします。
これは大量のログを生成します。
</p>

<p>
<code>runtime.log.invalid.references = true </code><br/>
falseにすると、リファレンスが無効のときのログ出力がされません。
出荷時には false にすると良いでしょう。
デバッグ時には、とても役立ちます。
</p>
 
   <p> 
   <code>runtime.log.logsystem.avalon.logger = <i>name</i> </code><br/> 
   ユーザに Avalon 構成で LogSystem インタフェースを使ったラップ無しで既存のログ
    <i>name</i> の指定を許します。
   <b>注意:</b> あなたは、またデフォルトのログシステムとしての
   <code>runtime.log.logsystem.class = 
   org.apache.velocity.runtime.log.AvalonLogSystem</code> を変更しなければ
   なりません。これは、Avalon ログシステムがデフォルトログシステムで残ることを
   保証して<b>いません</b>。

</p>

<p>
<strong>Character Encoding</strong>
</p>

<p>
<code>input.encoding = ISO-8859-1</code><br/>
(テンプレート)入力のエンコーディング文字を指定します。
これを使用すると、テンプレートで UTF-8 のような別のエンコーディングを
使用することができます。
</p>

<p>
<code>output.encoding = ISO-8859-1</code><br/>
VelocityServlet と Anakia からの出力ストリームのための文字エンコーディング
</p>

<p>
<strong>#foreach() Directive</strong>
</p>

<p>
<code>directive.foreach.counter.name = velocityCount</code><br/>
#foreach() 指令で使用され、ループカウントのためのコンテキストキー
として使用されるもじれつを定義する。テンプレートは、ループカウントとして
$velocityCount でアクセスできる。
</p>

<p>
<code>directive.foreach.initial.value = 1</code><br/>
#foreach()ループで参照されるループカウンタのための開始時のデフォルト値
</p>

<p>
<strong>#include() and #parse() Directive</strong>
</p>

<p>
<code>directive.include.output.errormsg.start 
= <![CDATA[ <!-- include error : ]]> </code><br/>
<code>directive.include.output.errormsg.end   
=  <![CDATA[ see error log --> ]]></code><br/>
#include() 指示に関する問題の場合、入力ストリームのエラー・メッセージ用に
開始タグと終了タグを定義します。.start タグと .end タグが定義されるならば、
エラー・メッセージは、.start と .end がプロパティ値を呼ぶ形式で
「.start msg .end」の、ストリームへの出力になります。
.start タグ と .end（次の）タグが定義されるならば、
レンダリング・ストリームへの出力は起こるだけです。
</p>

<p>
<code>directive.parse.maxdepth = 10</code><br/>
テンプレートが解析できる深さを定義します。
テンプレートは、#parse() の中で、さらに #parse() 指示を含んでいるかもしれません。
この値は、#parse() 再帰の無限ループを防ぎます。
</p>

<p>
<strong>Resource Management</strong>
</p>

<p>
<code>resource.manager.logwhenfound = true</code><br/>
リソース管理からの「見つかった」メッセージのロギングを制御を切り替える。
リソースが最初に見つかったときに、リソース名とローダーのクラス名が
実行時ログに通知されます。
</p>

<p>
<code>resource.loader = &lt;name&gt; (default = File)</code><br/>
<i>複数値のキー。値のCSV形式を受け入れる。</i>
リソースローダーの Public 名が使用される。この public 名は、
リソースローダーの特定のプロパティを指定するのに使用される。
注意: 複数値のキーでは、"file, class" (クオート無しで)とような値を渡すことが可能になり、
以下に示されるように2つ値がローダーによって設定値となる。
</p>

<p>
<code>&lt;name&gt;.loader.description 
= Velocity File Resource Loader</code><br/>
与えられたローダーの説明文字列。
</p>

<p>
<code>&lt;name&gt;.resource.loader.class 
= org.apache.velocity.runtime.resource.loader.FileResourceLoader</code><br/>
ローダーのクラスの実装名。デフォルトローダーは、ファイルローダー。
</p>

<p>
<code>&lt;name&gt;.resource.loader.path = .</code><br/>
<i>複数値のキー。CSV形式の値を受けれます。</i>
Rootは、ローダーが読み込むテンプレートからです。テンプレートは
このルートのサブディレクトリに存在しないければなりません。
例えば、 homesite/index.vm 。　この設定キーは、現在のところ
FileResourceLoader と JarResourceLoader に適用されます。
</p>

<p>
<code>&lt;name&gt;.resource.loader.cache = false</code><br/>
ローダーでのテンプレートのキャッシュ制御。
配備と開発の問題を簡単にするために、デフォルトは false です。
製品配備のときには、true にすべきです。
「true」のとき、<code>modificationCheckInterval</code> プロパティが適用されます。
これは、リロード制御の便宜のためのキャッシュ機能の制御を許可します。
テンプレートが頻繁に更新され、
アプリケーションに戻ったり、サーブレットエンジンにその機能を
望んでいない場合や許可されていない場合などに
ホスティング環境や ISP 環境で役に立ちます。
</p>

<p>
<code>&lt;name&gt;.resource.loader.modificationCheckInterval = 2</code><br/>
これは、キャッシュがオンにされたときに、修正がされたかチェックする間隔を
秒数で指定します。この数字が &gt; 0 の場合、テンプレートが修正されたか
チェックする間隔を秒であらわしています。もしテンプレートが最後にチェック
したときから変更されていれば、それは再ロードされて、再解析されます。
そうでなければ、何もしません。
また、この数字が &lt;= 0 のとき、修正チェックは行なわれません、プロパティ
<code>cache</code>(上) が true と仮定するとテンプレートを最初にしようする
ときに一度だけ、読み込まれ解析され、それはアプリケーションやサーブレットエンジンが
リスタートされるまでチェックやリロードはされません。
</p>


<p> 
実例を示すために、ここで、例が、FileResourceLoader をセットアップすることはどのように管理されるかについて示して、デフォルトの Velocity プロパティからのとられます
</p>

<source><![CDATA[
resource.loader = file

file.resource.loader.description = Velocity File Resource Loader
file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
file.resource.loader.path = .
file.resource.loader.cache = false
file.resource.loader.modificationCheckInterval = 2
]]></source> 

<p>
<strong>Velocimacro</strong>
</p>

<p>
<code>velocimacro.library = VM_global_library.vm </code><br/>
<i>複数値のキー。CSV 形式の値を受け入れます。</i>
Velociry 実行時エンジンが開始したときに、ロードされる
Velocimacro ライブラリのファイル名です。これらの Velocimacro は、
すべてのテンプレートでアクセスすることができます。ファイルは
ファイルローダーリソースパスのルートからの相対パスを仮定しています。
</p>

<p>
<code>velocimacro.permissions.allow.inline = true</code><br/>
テンブレート内で #macro() 指示を通して新しい Velocimacros の定義を可能にするかどうかを
決定します。デフォルト値は true です。そして、どんなテンプレートでも新しいVelocimacrosを定義して、使うことができることを意味します。
注意: 他のプロパティに従い、それらの #macro() ステートメントがグローバルな定義を置き換えることができるます。

</p>

<p>
<code>velocimacro.permissions.allow.inline.to.replace.global = false </code><br/>
テンプレート内で「inline」定義された Velocimacro が、起動時にロードされたライブラリ内の
Velocimacro定義を置換するかどうか制御します。
</p>

<p>
<code>velocimacro.permissions.allow.inline.local.scope = false</code><br/>
Velocimacros の「プライベート」テンプレートのネームスペースの制御です。
true のとき、テンプレートで #macro() 指示で作成した Velocmacro は、
テンプレートを定義したところからのみアクセスすることができます。
これは、それらが起動時にロードされるグローバルやローカルのライブラリ
にない限り、Velocimacros が共有できないことを意味します。（上記参照。）
また、テンプレートがお互いに干渉することが無いことを意味します。
「デフォルト」の Velocimacro 定義がグローバルであるかそのローカルのライブラリにある所で、
このプロパティもテクニックを許します、そして、テンプレートはそのテンプレートの範囲内で使用のために実装を「オーバーライド」できます。
これは、このプロパティが true の場合に、テンプレートのネームスペースは、
Velocimacro の検索は、グローバルネームスペースより先に行なわれるので、
オーバーライドが働きます。
</p>
<p>
<code>velocimacro.context.localscope = false</code><br/>
Velocimacro の範囲内のリファレンス・アクセス（set/get）がコンテキストを変えることになるか、その Velocimacro でローカル範囲であることになるかどうか制御します。
</p>

<p>
<code>velocimacro.library.autoreload = false</code><br/>
Velocimacro ライブラリの自動ロードを制御します。
<code>true</code>にセットすると、Velocimacro ライブラリソースを
Velocimacro が変更されたか確認するようになり、必要であればリロードされます。
これは、ちょうど通常のテンプレートと同じように、
サーブレットコンテナやあなたのアプリケーションをリスタートせずに
Velocimacro ライブラリの変更をすることができるようになります。
これは、リソースローダーのキャッシュが <i>off</i> (つまり 
 <code>file.resource.loader.cache = false</code> ) の場合のみ動作します。
この機能は、開発の用途を目的としており、製品のためではありません。
</p>


<p>
<strong>String Interpolation</strong>
</p>

<p>
<code>runtime.interpolate.string.literals = true</code><br/>
VTL String リテラルの展開の仕組みを制御します。
VTL String リテラルは、特に一般に#set() ステートメント、リファレンスのメソッド呼び出し、
VM へのパラメータにおいてまたは指示的な VTL への引数として使われる二重の引用符を使っているストリングであるという注意。
詳細はVTLリファレンスを見てください。

</p>

<p>
<strong>Runtime Configuration</strong>
</p>

<p>
<code>parser.pool.size = 20</code><br/>
このプロパティは、Velocity が起動時に作成して、プールに保持する
パーサの数を設定します。
デフォルトでは、20 のパーサーですが、たいていの使用のでは十分なはずです。
Velocity がパーサーを使い果たすと、ログに記録され、必要に応じてそれらが
作成されます。
ただし、それらはプールに加えられないことに注意してください。
これは、標準的なパーサーのプールと比較して遅い操作ですが、
これは例外的な状態です。あなたがログ・メッセージに出ている場合には、
このプロパティの数字を増やしてください。
</p>

</section>

<section name="Configuring the Log System">

<p>
Velocity には、シンプルで柔軟性を兼ね備えてた素晴らしい2,3のロギング機能があります。
どんな特別な設定をしなくても、Velocity は、ファイルベースのログに
すべてのログメッセージを Velocity がインストールされた「カレントディレクトリ」
にに <code>velocity.log</code> という名前のファイルで出力します。
より高度な使い方をするユーザーのために、あなたは、
あなたの現在のロギングの機能に対して Velocity の全てのログメッセージを
統合させるかもしれません。
</p>

<p>
あなたのオプション
</p>

<ul>

<li>
<b>Default Configuration</b><br/>
デフォルトで、Velocity は、ファイルベースのログをカレントディレクトリに作成します。
</li>

<li>
<b>Custom Standalone Logger</b><br/>
あなたは、カスタムロギングクラスを作成することができます。−
あなたは単にインタフェース <code>org.apache.velocity.runtime.log.LogSystem</code> を実装しなければならなくて、それから単に構成プロパティ <code>runtime.log.logsystem.class</code> にクラス名を設定し、そして、Velocity は init 時にそのクラスのインスタンスを作ります。
あなたが他のプロパティも指定するために、あなたは別のクラス名を指定するかもしれません。
詳細については、<a href="developer-guide.html#Using Velocity In General Applications">
Velocity helper class</a> と
<a href="developer-guide.html#Velocity Configuration Keys and Values">configuration keys and values.</a> を参照してください。
</li>

<li>
<b>Integrated Logging</b><br/>
単に <code>org.apache.velocity.runtime.log.LogSystem</code> インタフェースを実装することによって、あなたは Velocity のロギング機能をあなたのアプリケーション現存のロギング・システムと統合することができます。
それから、あなたが init() を呼ぶ前に <code>runtime.log.logsystem</code> 構成キーによって、Velocity にクラスをロギング・インスタンスを渡してください、そして、Velocity はあなたのアプリケーション logger にメッセージをロギングすることになります。
詳細は、
<a href="developer-guide.html#Using Velocity In General Applications">Velocity ヘルパークラス</a>と
<a href="developer-guide.html#Velocity Configuration Keys and Values">キーと値の設定</a>を参照してください。
</li>
</ul>

<p>
とっても単純ならば、カスタム logger を作ります。
下のコードは、あなたがあなた自身のアプリケーションにおいてこれをするかもしれない方法の単純なスケッチです。
</p>

<a name="Simple Example of a Custom Logger"><strong>Simple Example of a Custom Logger</strong></a>

<p>
これは、あなたの独自のアプリケーションで Velocity のロギングシステムを統合する
方法の簡単な例です。
</p>

<source><![CDATA[
import org.apache.velocity.runtime.log.LogSystem;

...

public class MyClass implements LogSystem
{

...

    public MyClass()
    {
        ...

        try
        {
            /*
             *  このクラスをloggerをとして登録
             */
            Velocity.setProperty(Velocity.RUNTIME_LOG_LOGSYSTEM, this );
            Velocity.init();
        }
        catch (Exception e)
        {
            /*
             *  なにか行なう
             */
        }             
    }

    /**
     *  これはVelocity用にログメッセージ付きで呼び出すようにあなたが実装したメソッド。
     */
    public void logVelocityMessage(int level, String message)
    {
        /*  なにかする */
    }
...
}            
]]></source>

</section>

<section name="Configuring Resource Loaders">

<p>
Velocity についての基本的で重要な部分のうちの1つは、
リソース管理システムとリソース・ローダーです。
リソース管理システムがまた、非テンプレートリソース（特に #include() 指示を通してロードされるもの）を取り扱うことになるので、それらは「テンプレート」よりむしろ「リソース」とここで呼ばれます。
</p>

<p>
非常に柔軟なリソース・ローダー・システムは非常に柔軟なので、同時に、
一つ以上のリソース・ローダーを指定することができます。
これは設定とリソース管理において相当な柔軟性を許します、そしてさらに、
あなたの特別な要求のためにあなた自身のリソース・ローダーを書ことができます。
</p>

<p>
現在、下記で説明される4種類のリソースローダーがVelocityに含まれます。
注意: サンプル設定プロパティでは、ローダーの共通名が示されます(
例えば、'file'は、<code>file.resource.loader.path</code>の「file」)。
この「共通名」は、あなたの設定では働かないかもしれません。
このシステムがどのように機能するかについて理解するために、
<a href="developer-guide.html#Velocity Configuration Keys and Values">リソース設定プロパティ</a>に関するセクションを参照してください。
また、これらのローダーの各々は、パッケージ <code>org.apache.velocity.runtime.resource.loader</code> にあります。
</p>

<ul>
<li>
  <b>FileResourceLoader :</b> このローダーはファイルシステムからリソースを得る。その設定プロパティは以下が含まれる:
  <ul>
    <li>
      <code>file.resource.loader.path</code> = &lt;path to root of templates&gt;
    </li>
    <li>
      <code>file.resource.loader.cache</code> = true/false
    </li>
    <li>
      <code>file.resource.loader.modificationCheckInterval</code> = &lt;seconds between checks&gt;
    </li>
  </ul>
これは、デフォルトのローダーであって、「現在のディレクトリ」からデフォルトでテンプレートを得るために、構成されます。
servlets で Velocity を使うことの場合、あなたがあなたのテンプレートをあなたがあなたの servlet エンジンを始動するディレクトリに保たなければならなくしたくないので、これは問題でありえます。
詳細は<a href="developer-guide.html#Using Velocity In Servlets">Velocityでservlet開発</a>セクションを見てください。
</li>

<li>
  <b>JarResourceLoader :</b> 
このローダーは、特定の jar ファイルからリソースを得ます。
あなたは、便宜上 jar にあなたのテンプレートをまとめることを除いて、
それは FileResourceLoader に非常に類似しています。
<code>jar.resource.loader.path</code> を除いて、プロパティは同一です、そこで、あなたはあなたがそこからリソースをロードしたい jar(s) のフルパスを提供します。
loader.path 用に jar を指定するために、あなたは <code>java.net.JarURLConnection</code> の標準の jar UR L構文を使います。
</li>

<li>
  <b>ClasspathResourceLoader :</b>
このローダーは、classloader からリソースを得ます。
一般的に、この意味は ClasspathResourceLoader は、クラスパスの場所から
テンプレートを読み込みます(例えば、jarの中)
classpath は一般に素晴らしい苦労と苦しみの出所であるが、Servlet仕様2.2(以降)に対応した servler ランナーを動かすとき、それは非常に役に立つ仕組みです。
<a href="http://jakarta.apache.org/tomcat/">Tomcat</a> は、その一例です。
あなたがしなければならない全てが jar であって、
効果的にこのローダーを使用するためには、あなたのテンプレートをすべてjarにして、
その jar をあなたの Web アプリケーションの Web-INF/lib ディレクトリに入れてください。
設定オプションについて心配する必要はありませんし、絶対パスと相対パスの問題に
ついても、Jar と File リソースローダーとなります。
繰り返しますが、ClasspathResourceLoader は、サーブレットコンテナのみが
使用すものではなく、どのアプリケーションコンテンツでも使用することができます。
</li>

<li>
  <b>DataSourceResourceLoader :</b> 
このローダーは、データベースのような DataSource からリソースをロードすることになります。
それが J2EE サポートを必要とするので、標準の部分がビルドでは、このローダーは構築されません。
このローダーをビルドするためには、どうか J2EE 配布をダウンロードして、
<code>build/lib</code> ディレクトリへの j2ee.jar を移動して、それからビルドするために、
<code>jar-j2ee</code> というビルドターゲットを使用して新しい velocity jar を構築します。
このローダーの詳細については、クラス<code>org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader</code>については javadoc を見てください。
</li>

</ul>

<a name="Configuration Examples"><strong>Configuration Examples</strong></a>

<p>
Velocity のためにリソース・ローダーを設定することは簡単です。
制御のプロパティで、詳細は
<a href="developer-guide.html#Configuring Resource Loaders">リソース設定</a>
セクションでリストされています。
</p>

<p>
一つ以上のリソース・ローダーを設定することにおける最初のステップは、
Velocity への名前によるそれらを「宣言します」。
プロパティ <code>resource.loader</code> を使ってください、そして、一つ以上のローダー名をリストしてください。
あなたはあなたが欲しい何でも使うことができます−これらの名前が構成与えられたローダーと関連するために使われます。
</p>

<source><![CDATA[
resource.loader = file
]]></source> 

<p>
そのエントリは、我々が「file」として知られているリソース・ローダーを
持つことになると宣言します。
次にすることは、重要なプロパティをセットすることです。
一番大事なのは、ローダーとして使用するクラスを宣言することです：
</p>

<source><![CDATA[
file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
]]></source> 

<p>
この場合、我々は Velocity に対して、「file」というリソースローダーを
設定し、それが
<code> org.apache.velocity.runtime.resource.loader.FileResourceLoader </code>
クラスを使用することを設定します。
次に、このローダーにとって重要なプロパティを設定します。
</p>

<source><![CDATA[
file.resource.loader.path = /opt/templates
file.resource.loader.cache = true
file.resource.loader.modificationCheckInterval = 2
]]></source> 

<p>
ここでは、我々は2、3のものを設定しました。
最初に、テンプレートを見つけるためのパスとして <code>/opt/templates</code>
を設定しました。
第二に、我々はキャッシュすることをオンにしました、そのため、
テンプレートまたは静的ファイルが読まれたあと、それはメモリにキャッシュされます。
そして、最後に、我々は新しいテンプレートのために更新チェック間隔を2秒にセットしました。
</p>

<p>
それらは、基本です。
以下は、異なる設定の2、3の例です。
</p>

<p>
<b>何もしないデフォルト設定 : </b>
名前のとおり、デフォルト設定をするので何も行なう必要はありません。
この設定はデフォルトのリソース・パスとして現在のディレクトリで FileResourceLoader を使います、そして、キャッシュは offです。
プロパティ・セットとして、次のように表されます：
</p>

<source><![CDATA[
resource.loader = file

file.resource.loader.description = Velocity File Resource Loader
file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
file.resource.loader.path = .
file.resource.loader.cache = false
file.resource.loader.modificationCheckInterval = 0
]]></source> 

<p>
<b>複数テンプレートパス設定 : </b>
テンプレートの検索パスを「ノード」として複数のディレクトリを検索するように
 FileResourceLoader を使用するように設定します。
また、キャッシュを使い、テンプレートを10秒間隔で変更点があるかチェックします。
プロパティ・セットとして、次のように表されるます：
</p>

<source><![CDATA[
resource.loader = file

file.resource.loader.description = Velocity File Resource Loader
file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
file.resource.loader.path = /opt/directory1, /opt/directory2
file.resource.loader.cache = true
file.resource.loader.modificationCheckInterval = 10
]]></source> 

<p>
<b>複数ローダー設定 :</b>
この設定は、同時に3つのローダー、FileResourceLoader、ClasspathResourceLoader と JarResourceLoaderをセットアップします。
ローダーは、最初に FileResourceLoader が参照され、それから ClasspathResourceLoader と最終的に JarResourceLoader と設定されます。
即座にテンプレートを置換するためにファイル・テンプレート領域に落とすことで
通常 jar 経由のものがクラスパス上でテンプレートが見つかるので
jarを作り直さなくてもよくなります。
</p>

<source><![CDATA[
#
# 3つのリソースローダーを使うことを指定
#
resource.loader = file, class, jar

#
# 'file'と名づけたローダーでは、使用するクラスとして FileResourceLoaderをセットして
# キャッシュを off にして、 テンプレート用に3つのディレクトリを使用する
#
file.resource.loader.description = Velocity File Resource Loader
file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
file.resource.loader.path = templatedirectory1, anotherdirectory, foo/bar
file.resource.loader.cache = false
file.resource.loader.modificationCheckInterval = 0

#
# 'class'と名づけたローダーでは、ClasspathResourceLoader を使用する
#
class.resource.loader.description = Velocity Classpath Resource Loader
class.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader

#
# 最後に、'jar'と名づけたローダーでは、JarResourceLoader を使用し、
# 2つのjarから読み込む
#
jar.resource.loader.description = Velocity Jar  Resource Loader
jar.resource.loader.class = org.apache.velocity.runtime.resource.loader.JarResourceLoader
jar.resource.loader.path = jar:file:/myjarplace/myjar.jar, jar:file:/myjarplace/myjar2.jar
]]></source> 

<p>
3つの名前「file」、「class」、「jar」があなたの都合と分類のためだけの単なるノードです。
それらはあなたが欲しい何ででもありえます−彼らが一緒にプロパティの集合を関連するために使われるだけです。
しかし、あなたが機能のいくらかのヒントを与える名前を使用することを推奨します。
</p>

<p>
注意: 3つとも全て適当な操作のために、ごくわずかな構成情報しか必要としないが、
ClasspathResourceLoaderが最も単純なものである。
</p>

</section>

<section name="Template Encoding for Internationalization">

<p>
バージョン1.1現在、テンプレートベースによるテンプレートリソースの文字エンコーディングの
指定をすることが可能です。
通常のリソースAPIは、エンコーディングを引数として渡すことが可能です：
</p>

<p>
<code>org.apache.velocity.servlet.VelocityServlet</code> : <br/>
<blockquote>
  <i><code> public Template getTemplate( String template, String encoding )</code></i>
</blockquote>
</p>

<p>
<code>org.apache.velocity.app.Velocity</code> : <br/>
<blockquote>
  <i><code>public static Template getTemplate(String name, String encoding)</code></i>
  <br/>
  <br/>
  <i><code>public static boolean mergeTemplate( String templateName, String encoding, Context context, Writer writer )</code></i>
  <br/>
  <i><code> </code></i>
</blockquote>
</p>

<p>
<i>encoding</i>引数のための値は、
あなたの JVM でサポートされる通常のエンコーディング仕様です。(例えば「UTF-8」または「ISO-8859-1」)。
文字セットの公式名称は、<a href="http://www.iana.org/assignments/character-sets">ここ</a>を参照してください。
</p>

<p>
注意: これはテンプレートのエンコーディングだけに該当します。−出力エンコーディングはアプリケーション特有の問題です。
</p>

</section>

<section name="Velocity and XML">

<p>
Velocity は柔軟性で単純なテンプレート言語で、XML データで動作するための理想的な環境です。
<a href="anakia.html">
Anakia</a> は、Velocity が XML から出力をレンダリングするためにXSLを置き換えるために使われる方法の例です。
このドキュメンテーションを含む Velocity サイトは、Anakia を使っている XML ソースから生成しています。
Jakarta サイトもまた Anakia を使用してレンダリングされています。
です。
</p>

<p>
通常、Velocity で XML を扱うことのパターンは、<a href="http://www.jdom.org/">JDOM</a>
のような便利な Java でデータ構造にアクセスできるものを使ってあなたの XML を処理します。
それから、あなたは JDOM ツリーから直接 XML ドキュメントにデータのアクセスを行い、テンプレートを生成します。例えば、次の XML 文書から始めると：
</p>

<source><![CDATA[
<?xml version="1.0"?>

<document>
 <properties>
  <title>Developer's Guide</title>
  <author email="geirm@apache.org">Velocity Documentation Team</author>
 </properties>
</document>
]]></source> 

<p>
ここで、次のようにコードを取り込む小さな Java プログラムを作成します。
</p>

<source><![CDATA[
...

SAXBuilder builder;
Document root = null;

try 
{
    builder = new SAXBuilder(  "org.apache.xerces.parsers.SAXParser" );
    root = builder.build("test.xml");
}
catch( Exception ee)
{}

VelocityContext vc = new VelocityContext();
vc.put("root", root );

...
]]></source>

<p>
（このやる方についての詳細は、配布の<code>examples</code>ディレクトリにある
Anakia サンプルを参照してください。）
さて、通常の Velocity テンプレートを作ります：
</p>

<source><![CDATA[
<html>
  <body>
    The document title is 
    $root.getChild("document").getChild("properties").getChild("title").getText()
  </body>
</html>
]]></source>

<p>
そして、通常行なうように、
Context に JDOM ツリーを含ませることを使用してテンプレートをレンダリングします。
もちろん、これはもっとも単純な例というわけではありませんが、
しかし、あなたが Velocity テンプレートから直接簡単に XM Lデータにアクセスすることができることは基本を示しています。
</p>

<p>
Velocity で XML データを一定の型に合わせる1つの本当の利点は、
あなたが他のどのオブジェクトへのアクセスまたはアプリケーションが提供するデータを持つということです。
あなたは、XML 文書においてデータ・プレゼントを使うだけであることに限られていません。
あなたは、あなたが追加の情報をあなたの出力のために用意するか、ヘルプへのツールがより簡単な XML データで働くことを作ると定めるためにコンテキストに欲しい何でも加えるかもしれません。
Bob McWhirter の <a href="http://sourceforge.net/projects/werken-xpath/"> Werken Xpath</a>
はそのような役に立つツールです−それが Anakia で使われる方法の例は
<code>org.apache.velocity.anakia.XPathTool</code> で見つけることができます。
</p>

<p>
XML と Velocity で起こる1つの問題は、XML エンティティによる処置への方法です。
あなたが出力ストリームにエンティティをレンダリングする必要があるとき、
1つのテクニックはVelocimacrosの使用を結合することです：
</p>

<source><![CDATA[
## まず、Velocimacro を何処かで定義する

#macro( xenc $sometext )$tools.escapeEntities($sometext)#end

## そして使用する

#set( $sometext = " < " )
<text>#xenc($sometext)</text>
]]></source>

<p>
ここで escapeEntities() は、あなたのためにカプセル化を行なうメソッドです。
別のトリックは、コンストラクタ・パラメータとしてのコンテキストをとって、メソッドを実装するだけであるコード化しているユーティリティを作成することになっています：
</p>

<source><![CDATA[
public String get(String key)
{
    Object obj = context.get(key)
    return (obj != null) ? Escape.getText( obj.toString() ) : "";
}
]]></source>

<p>
"xenc" としてコンテキストを置く。そして次のように使用する:
</p>

<source><![CDATA[
<text>$xenc.sometext</text>
]]></source>

<p>
これが、それがコンテキストで $xenc オブジェクトの get("sometext")
を呼ぶために試みることになるように Velocity の introspection プロセスの利点があります。
そして xenc オブジェクトは、Context から値を取得することができ、エンコードして、戻します。
</p>

<p>
代わりに、Velocity がカスタム・コンテキスト・オブジェクトを実装することを簡単にして以後、
あなたは常に何にでも返されるストリングをコード化することを適用するあなた自身のコンテキストを実装することができました。
彼らがオブジェクトまたはストリング（それは、コード化することを必要とするかもしれません）を返すことができたので、メソッドの出力を提出することを避けることは直接呼ぶように注意してください。
指示的な #set() と使用によるコンテキストに、最初にそれらを置きます、例えば：
</p>

<source><![CDATA[
#set( $sometext = $jdomElement.getText() )
<text>$sometext</text>
]]></source>

<p>
XML エンティティを扱うための前の提案は、Christoph Reck（Velocityコミュニティの活発な参加者）から行なわれました。
我々は、この文書に対する彼の[知らない]貢献に、非常に感謝して、彼の考えがあまりひどくたたきつぶされなかったことを望みます：）
</p>

</section>

<section name="Summary">

<p>
我々は、この簡潔なガイドがあなたの Java プロジェクトで Velocity を使うのに役に立つ
紹介であることを望みます。また、Velocity に興味をもっていただいたことを感謝します。
我々は、このドキュメンテーションについてや、Velocity テンプレート・エンジンそのものに
ついてのコメントは何でも歓迎します。
</p>

<p>
我々の<a href="http://jakarta.apache.org/getinvolved/mail.html">メーリングリスト</a>
に参加して、徹底的に全ての詳細で、考え深くて建設的なフィードバックをお願いします。
</p>
</section>
</body>
</document>
