1. Velocityの概要
2005.11.01 株式会社四次元データ 里見玲爾
- 1.1. Velocityとは
- 1.2. Velocityのインストール
- 1.3. Velocityの簡単な例
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を使った簡単な例を作成します。 この仕組みがよく用いられるのは「似た形式の文章を多数用意する必要がある」場合なので、 ここでは注文伝票の例を考えることにします。
注文伝票には定型文と日付、注文品、価格などが必ず記載されています。 どの注文伝票にも書かれている部分は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について、詳しく説明します。

