8. VelocityクラスとVelocityEngineクラス
2006.01.17 株式会社四次元データ 里見玲爾
- 8.1. Singletonモデル
 - 8.2. 分離インスタンスモデル
 - 8.3. メソッド
 
この章ではVelocityエンジンを利用する際の2種類のモデルと、それを制御するVelocityクラスとVelocityEngineクラスについて解説します。
VelocityクラスとVelocityEngineクラスは、どちらもVelocityを利用するときに必要なクラスです。 Velocityエンジンを利用する際には、Singletonモデルか分離インスタンスモデルか2つの選択肢があり、 Singletonモデルを採用するとVelocityクラス、分離インスタンスモデルを採用するとVelocityEngineクラスを 利用します。
8.1. Singletonモデル
これは従来のパターンで、VelocityエンジンのただひとつのインスタンスをJVM(java仮想マシン)で共有します。 実際はVelocityクラスをインスタンス化せずにクラス変数としてVelocityを使用します。 ちなみに第1章ではこのモデルでVelocityを利用していました。 以下のようにして使用します。
 import org.apache.velocity.app.Velocity; 
 import org.apache.velocity.Template;
 (略)
 
 /* エンジンの初期化 */
 Velocity.init();
 
 (略)
 
 /* テンプレートの取得 */
 Template template = Velocity.getTemplate("sample.vm");
 (略)
8.2. 分離インスタンスモデル
分離インスタンスモデルはバージョン1.2から可能になったモデルで、 同じJVMでVelocityエンジンのインスタンスをいくつでも生成、設定、使用できるようになりました。 これは同じアプリケーションで別々の構成をサポートしたいときに役に立ちます。 以下のようにして使用します。
 import org.apache.velocity.app.VelocityEngine;
 import org.apache.velocity.Template;
 (略)
 
 VelocityEngine velocity = new VelocityEngine();
 
 /* エンジンの初期化 */
 velocity.init();
 
 (略)
 
 /* テンプレートの取得 */
 Template template = velocity.getTemplate("sample.vm");
 (略)
8.3. メソッド
VelocityクラスとVelocityEngineクラスで定義されたメソッドは、クラスメソッドかどうかを除けば同じです。 以下に主なメソッドを示します。
| メソッド | 解説 | 返り値 | 
|---|---|---|
| setProperty(String key, java.lang.Object object) | 設定ファイルのkey設定キーに値objectを設定します。このobjectは、ほとんどの場合はStringです。 | void | 
| getProperty(String key) | keyの名称設定キーの値を返り値として返します。 このとき返り値がStringであるかCSV形式のものであるかをある程度把握しておく必要があります。 | java.lang.Object | 
| init() | デフォルトの設定ファイルでVelocityを初期化します。 初期化は1度だけ有効で、2回目以降の初期化は無視されます。 | void | 
| init(java.util.Properties p) | 引数のオブジェクトに含まれるプロパティでVelocityを初期化します。 | void | 
| init(String filename) | filenameで指定したプロパティを利用してVelocityを初期化します。 | void | 
| evaluate(Context context, Writer writer, String logTag, String instring) | contextの値を利用して入力(ここではinstring)を出力(ここではwriter)にレンダリングします。 | boolean | 
| getTemplate(String templateName) | templateNameテンプレートを取得します。第2引数に文字コードをString型で受け取ることもできます。 | org.apache.velocity.Template | 
| mergeTemplate(String templateName, Context context, Writer writer) | templateNameテンプレートとcontextの値をマージしてwriterに出力します。Templateのインスタンスを 生成せずに直接マージします。 | boolean | 
| templateExists(String templateName) | templateNameテンプレートが存在するか判断します。 ResourceNotFoundExceptionが投げられる前に状態を得ることが可能になります。 | boolean | 
| invokeVelocimacro(String vmName, String templateName, String[] params, Context context, Writer writer) | Velocimacroへ直接アクセスするときに使用します。contextの値を利用してVelocimacroを実行し、 writerに出力します。 vmNameは呼び出すVelocimacroの名前、templateNameは例外取得時に呼び出されるテンプレートの名前、 paramsはVerocimacroに与える引数の配列です。 | boolean | 
Velocityクラスの場合、これらのメソッドはすべてクラスメソッドとして定義されています。
またmergeTemplateメソッドはgetTemplateメソッドとTemplateクラスのmergeメソッドを同時に行うもので、 Templateインスタンスを生成しないのが特徴です。 テンプレートオブジェクトを他で利用しない場合には便利です。 またmergeメソッドと同様にcatch文でエラーを取得する必要があります。
 (略)
 Velocity.init();
 (略)
 
 try{
 
  (略)
 
    Velocity.mergeTemplate("sample.vm", context, writer);
 
 }catch(ResourceNotFoundException e){
     //テンプレートが見つからなかった場合の処理
 }catch(ParseErrorException e){
     //テンプレート内の構文に関する例外などがあったときの処理
 }catch(java.lang.Exception e){
     //その他の例外があったときの処理
 }
 
 (略)
	

