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について、詳しく説明します。