目次へ

1. Velocityの概要

2005.11.01 株式会社四次元データ 里見玲爾

1.1. Velocityとは

Velocityとは、Javaベースのテンプレートエンジンです。 テンプレートエンジンとはプログラムで変更する部分と、 雛形となるドキュメントのテンプレートを別々に扱う仕組みです。 テンプレートエンジンはプログラムで変更する部分をテンプレートに埋め込むことにより、出力ファイルを作ります。 テンプレートエンジンによってプログラムの実行時に内容が変わる部分と、変わらない部分を別にして扱える利点が生まれます。

Velocityではこの「変わる部分」を「org.apache.velocity.VelocityContext」で扱い、 「変わらない部分」をテンプレートとして扱います。 このテンプレートはVTL(Velocity Template Language)というテンプレート言語によって記述され、 vmという拡張子を持つVMファイルとして保存されます。

1.2. Velocityのインストール

Velocityは、Java2VMがインストールされていれば動作します。 ダウンロードは以下のサイトで行います。

http://jakarta.apache.org/site/downloads/downloads_velocity.html

ダウンロードしたファイルを解凍し、jakartaプロジェクトのAntを使ってビルドを行います。 また、ビルドに必要なファイルは CVS または 夜間ビルド で入手できます。

配布ディレクトリの、jakarta-velocity/buildディレクトリでantコマンドを実行します。

1.3. Velocityの簡単な例

Velocityを使った簡単な例を作成します。 この仕組みがよく用いられるのは「似た形式の文章を多数用意する必要がある」場合なので、 ここでは注文伝票の例を考えることにします。

図1

注文伝票には定型文と日付、注文品、価格などが必ず記載されています。 どの注文伝票にも書かれている部分はVMファイルにテキストで記述し、 伝票によって変化する部分はVTLで記述します。 その部分はVelocityによって統合(マージ)して出力されます。

Visitor.java

Visitor.javaは、ユーザの情報を管理します。

   /**
    ユーザ情報を管理するクラス.
    */
   public class Visitor{
       private String name = ""; //お客さまの名前
       private String address = ""; //お客さまの住所
  
       public Visitor(){}
       public Visitor(String name, String address){
          this.name = name;
          this.address = address;
      }
      public String getName(){
          return name;
      }
      public String getAddress(){
          return address;
      }
  }

ここではユーザ情報として名前と住所のみを扱い、5、6行目でインスタンス変数として定義しています。 また13-18行目のgetメソッドはプログラム上では使っていませんが、Velocityがプロパティを呼び出す際に 使われるので定義しておきます。

Goods.java

次にGoods.javaです。Goods.javaは商品情報を管理します。

   /**
    商品情報を管理するクラス
    */
   public class Goods{
       private String goodsName = ""; //商品名
       private int price = 0; //価格
       
       public Goods(){}
       public Goods(String goodsName, int price){
          this.goodsName = goodsName;
          this.price = price;
      }
      public String getGoodsName(){
          return goodsName;
      }
      public int getPrice(){
          return price;
      }
  }

商品情報は商品名と価格のみを扱い、5、6行目でインスタンス変数として定義しておきます。 またVisitorクラスと同じ理由で13-18行目にgetメソッドを定義しておきます。

order.vm

次にorder.vmファイルです。このファイルはVTLを用いることにより、Javaのオブジェクトを参照することができます。


  $visitor.name さま
  
   
  この度はお買い上げいただき誠にありがとうございます。
  
  商品のほうは
  
  $visitor.address

  のほうにご配送させていただきます。
  
  【商品】
  
    商品名  :  $goods.goodsName
    
    価格    :  $goods.price 円
  

このテンプレートファイルで、$で始まる部分が値へと置き換わります。

GoodsController.java

GoodsController.javaでは実際の商品情報を入力し、テンプレートとマージして出力します。

   import java.io.StringWriter;
   import org.apache.velocity.Template;
   import org.apache.velocity.VelocityContext;
   import org.apache.velocity.app.Velocity;
   import org.apache.velocity.exception.ResourceNotFoundException;
   import org.apache.velocity.exception.ParseErrorException;
   import org.apache.velocity.exception.MethodInvocationException;
  
   /**
   情報処理やマージなどの処理を行うクラス
   */
  public class GoodsController{
 	public static void main(String args[]){
      	//お客さまの情報を作成
      	Visitor visitor = new Visitor("四次元太郎", "京都府京都市中京区御池通間之町東入高宮町206 御池ビル6階");
      	//商品の情報を作成
      	Goods goods = new Goods("三段収納BOX", "2980");
      	try{      
          	//Velocityの初期化
          	Velocity.init();
          	//Velocityコンテキストに値を設定
          	VelocityContext context = new VelocityContext();
          	context.put("visitor", visitor);
          	context.put("goods", goods);
          
          	StringWriter sw = new StringWriter();
          	//テンプレートの作成
          	Template template = Velocity.getTemplate("order.vm", "EUC-JP");
          	//テンプレートとマージ
          	template.merge(context,sw);
          	//マージしたデータはWriterオブジェクトであるswが持っているのでそれを文字列として出力
          	System.out.println(sw.toString());
          	sw.flush();
          
      	//エラー処理
      	} catch (ResourceNotFoundException e) {
         	//テンプレートが見つからないときの処理
      	} catch (ParseErrorException e) {
          	//構文にエラーがあるときの処理
      	} catch (MethodInvocationException e) {
          	//テンプレートのどこかにエラーがあるときの処理
      	} catch (Exception e) {
          	//その他のエラー時の処理
      	}
          
 	}
  }

23-24行目のput()メソッドでVelocityContextに値をセットし、 28行目のgetTemplate()メソッドでテンプレートファイルを呼び出します。また第2引数は文字コードを 指定しています。 出力結果は次のようになります。


  四次元太郎 さま


  この度はお買い上げいただき誠にありがとうございます。
  
  商品のほうは
  
  京都府京都市中京区御池通間之町東入高宮町206 御池ビル6階

  のほうにご配送させていただきます。
  
  【商品】
  
    商品名  :  三段収納BOX
    
    価格    :  2980 円
 

次章以降はVTLについて、詳しく説明します。

 

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp