1. Velocityの概要2005.11.01 株式会社四次元データ 里見玲爾
Velocity 1章 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.javaVisitor.javaは、ユーザの情報を管理します。
1: /**
2: ユーザ情報を管理するクラス.
3: */
4: public class Visitor{
5: private String name = ""; //お客さまの名前
6: private String address = ""; //お客さまの住所
7:
8: public Visitor(){}
9: public Visitor(String name, String address){
10: this.name = name;
11: this.address = address;
12: }
13: public String getName(){
14: return name;
15: }
16: public String getAddress(){
17: return address;
18: }
19: }
ここではユーザ情報として名前と住所のみを扱い、5、6行目でインスタンス変数として定義しています。 また13-18行目のgetメソッドはプログラム上では使っていませんが、Velocityがプロパティを呼び出す際に 使われるので定義しておきます。 Goods.java次にGoods.javaです。Goods.javaは商品情報を管理します。
1: /**
2: 商品情報を管理するクラス
3: */
4: public class Goods{
5: private String goodsName = ""; //商品名
6: private int price = 0; //価格
7:
8: public Goods(){}
9: public Goods(String goodsName, int price){
10: this.goodsName = goodsName;
11: this.price = price;
12: }
13: public String getGoodsName(){
14: return goodsName;
15: }
16: public int getPrice(){
17: return price;
18: }
19: }
商品情報は商品名と価格のみを扱い、5、6行目でインスタンス変数として定義しておきます。 またVisitorクラスと同じ理由で13-18行目にgetメソッドを定義しておきます。 order.vm次にorder.vmファイルです。このファイルはVTLを用いることにより、Javaのオブジェクトを参照することができます。
$visitor.name さま
この度はお買い上げいただき誠にありがとうございます。
商品のほうは
$visitor.address
のほうにご配送させていただきます。
【商品】
商品名 : $goods.goodsName
価格 : $goods.price 円
このテンプレートファイルで、$で始まる部分が値へと置き換わります。 GoodsController.javaGoodsController.javaでは実際の商品情報を入力し、テンプレートとマージして出力します。
1: import java.io.StringWriter;
2: import org.apache.velocity.Template;
3: import org.apache.velocity.VelocityContext;
4: import org.apache.velocity.app.Velocity;
5: import org.apache.velocity.exception.ResourceNotFoundException;
6: import org.apache.velocity.exception.ParseErrorException;
7: import org.apache.velocity.exception.MethodInvocationException;
8:
9: /**
10: 情報処理やマージなどの処理を行うクラス
11: */
12: public class GoodsController{
13: public static void main(String args[]){
14: //お客さまの情報を作成
15: Visitor visitor = new Visitor("四次元太郎", "京都府京都市中京区御池通間之町東入高宮町206 御池ビル6階");
16: //商品の情報を作成
17: Goods goods = new Goods("三段収納BOX", "2980");
18: try{
19: //Velocityの初期化
20: Velocity.init();
21: //Velocityコンテキストに値を設定
22: VelocityContext context = new VelocityContext();
23: context.put("visitor", visitor);
24: context.put("goods", goods);
25:
26: StringWriter sw = new StringWriter();
27: //テンプレートの作成
28: Template template = Velocity.getTemplate("order.vm", "EUC-JP");
29: //テンプレートとマージ
30: template.merge(context,sw);
31: //マージしたデータはWriterオブジェクトであるswが持っているのでそれを文字列として出力
32: System.out.println(sw.toString());
33: sw.flush();
34:
35: //エラー処理
36: } catch (ResourceNotFoundException e) {
37: //テンプレートが見つからないときの処理
38: } catch (ParseErrorException e) {
39: //構文にエラーがあるときの処理
40: } catch (MethodInvocationException e) {
41: //テンプレートのどこかにエラーがあるときの処理
42: } catch (Exception e) {
43: //その他のエラー時の処理
44: }
45:
46: }
47: }
23-24行目のput()メソッドでVelocityContextに値をセットし、 28行目のgetTemplate()メソッドでテンプレートファイルを呼び出します。また第2引数は文字コードを 指定しています。 出力結果は次のようになります。
四次元太郎 さま
この度はお買い上げいただき誠にありがとうございます。
商品のほうは
京都府京都市中京区御池通間之町東入高宮町206 御池ビル6階
のほうにご配送させていただきます。
【商品】
商品名 : 三段収納BOX
価格 : 2980 円
次章以降はVTLについて、詳しく説明します。 |
![]()
![]()
|