velocityを使ってみる
LastUpdate : 11/11/03
apache velocityとはJava用テンプレートエンジンのライブラリです。
ひょんなことから使うことになったので、その使い方をメモします。
Velocityjはなんだか、いろいろ機能がある様子ですが個人的主観で、必要だと思う部分のみ抜粋してメモしてます。
☆もくじ
今回のメモを作るにあたり、以下の環境で試しました。
開発環境 | jdeveloper11.1.1.5.0 |
velocityのバージョン | 1.7 |
以下のページから、velocityのjarをDLします。
http://http://velocity.apache.org/
jarがいくらか含まれています。トップディレクトリに、二つvelocityのjarがありますが、以下のように使い分けろってことらしい(「WHY_TWO_JARS.txt」に説明が書いてあります)。
jar名 | 説明 |
velocity-1.7.jar | velocityのjarのほかに、依存関係のあるjarが実行には必要。 必要なjar: (1) Jakarta Commons Collections (2)Jakarta Commons Lang (3) Excalibur (ex-Avalon) Logkit (4) Jakarta ORO (1)(2)は必須。(3)(4)は必須ではないが無いと実現できない機能がある。 (これについては「developer-guide.html」に書いてあります。) |
velocity-1.7-dep.jar | 依存するほかのjarも含めてセットになってる。これ一個使えばvelocity使えるよ! |
(1)〜(4)のjarも、ダウンロードファイルに含まれています。
テンプレートファイルを作成します。
このテンプレートファイルはVTLという言語で記述します。
sample1.vm |
「$msgObj.name」さんのお金使用状況 今月のお給料 : $msgObj.salary円 今月のお出費 : $msgObj.expense円 ひゃっはー金がないぜ! |
上記テンプレートを元に、以下のようにvelocityを利用し、文字列を生成します。以下のクラスを「new VelocitySample().main()」で呼んでやれば動きます
VelocitySample.java |
import java.io.StringWriter; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; /** * apache Velocityを使用するに当たり以下のjarが必要 * * Avalon-logkit-2.1.jar * Commons-collections-3.2.1.jar * Commons-lang-2.4.jar * Oro-2.0.8.jar * Velocity-1.7.jar */ public class VelocitySample { /** テンプレートファイルがあるディレクトリのパス */ private static String TEMPLATE_FILE_DIRECTORY = "D:/dev/jdev/default/mywork/JavaProgram/template"; public void main() { StringWriter writer = new StringWriter(); MessageBucket msg = new MessageBucket("わんわんお", 100, 1000); try { /* Velocityの初期化前に、必要な設定をVelocityに対し設定してあげる */ // テンプレートファイルのあるディレクトリを指定する(指定しない場合、現在のディレクトリになるっぽい) Velocity.setProperty("file.resource.loader.path", TEMPLATE_FILE_DIRECTORY); // Velocityの初期化 Velocity.init(); // コンテキストを生成 VelocityContext context = new VelocityContext(); context.put("msgObj", msg); // テンプレートを作成 Template tmplate = Velocity.getTemplate("sample1.vm", "MS932"); // データを生成し、結果をwriterに出力 tmplate.merge(context, writer); } catch (Exception e) { System.out.println(e); } System.out.println("■結果を出力"); System.out.print(writer.toString()); } } |
MessageBucket.java |
public class MessageBucket { private String name; private int salary; private int expense; public MessageBucket(String name, int salary, int expense) { this.name = name; this.salary = salary; this.expense = expense; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setSalary(int salary) { this.salary = salary; } public int getSalary() { return salary; } public void setExpenses(int expense) { this.expense = expense; } public int getExpense() { return expense; } } |
出力結果
■結果を出力 「わんわんお」さんのお金使用状況 今月のお給料 : 100円 今月のお出費 : 1000円 ひゃっはー金がないぜ! |
VTLとは、Velocityで使うテンプレートファイルで使用する言語です。
制御構文やループなどができますので、基本的なサンプルを以下に示します。
テンプレートファイル
## こうするとコメント文になります #* こうすると囲まれた範囲がコメントとなります 変数を出力する際、「$クラスのプロパティ名」としていますが、「${クラスのプロパティ名}」 という表記ができます。 これはaaaという文の前にaaaというプロパティを記述したい場合「$aaaaaa」となってしまい、判別不能です。 なので、「${aaa}aaa」と表記することで正しく動かすことができます。 *# ----------------------------------- $pageInfo.pageTitle ($pageInfo.date) 「$dataBucket.msgBucket.name」さん 今年の収入 : $dataBucket.msgBucket.salary 今年の出費 : $dataBucket.msgBucket.expense ## 以下のように繰り返しも可能です ## $velocityCountという値がループ中のカウンタ名です(Velocityのデフォルト設定) ## $objはjavaの拡張forループみたいに、ループ内で使用する変数名です 詳細: #foreach($obj in $dataBucket.msgList) <$velocityCount> $obj.name: 収入 : $obj.salary 出費 : $obj.expense #end ## メソッドの引数を指定して呼び出しも可能です 給料に対する感想 : $dataBucket.evaluateSalary(0) 給料に対する感想 : $dataBucket.evaluateSalary(1) 給料に対する感想 : $dataBucket.evaluateSalary(100) 給料に対する感想 : $dataBucket.evaluateSalary(500) 給料に対する感想 : $dataBucket.evaluateSalary(1000) 給料に対する感想 : $dataBucket.evaluateSalary($dataBucket.msgBucket.salary) ----------------------------------- |
Javaのソース
VelocitySample.java mainからnew VelocitySample().doWork2()って呼べば動くよ! |
import java.io.StringWriter; import java.util.Date; import java.util.LinkedList; import java.util.List; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; /** * apache Velocityを使用するに当たり以下のjarが必要 * * Avalon-logkit-2.1.jar * Commons-collections-3.2.1.jar * Commons-lang-2.4.jar * Oro-2.0.8.jar * Velocity-1.7.jar */ public class VelocitySample { /** テンプレートファイルがあるディレクトリのパス */ private static String TEMPLATE_FILE_DIRECTORY = "D:/dev/jdev/default/mywork/JavaProgram/template"; /** * VTLの制御構文など */ public void doWork2() { StringWriter writer = new StringWriter(); // データを用意する DataBucket bucket = new DataBucket(); List<MessageBucket> list = new LinkedList<MessageBucket>(); list.add(new MessageBucket("1月", 100, 100)); list.add(new MessageBucket("2月", 200, 1000)); list.add(new MessageBucket("3月", 300, 10000)); list.add(new MessageBucket("4月", 400, 10)); list.add(new MessageBucket("5月", 500, 100)); list.add(new MessageBucket("6月", 600, 1000)); list.add(new MessageBucket("7月", 700, 10000)); list.add(new MessageBucket("8月", 800, 100000)); list.add(new MessageBucket("9月", 900, 1000000)); list.add(new MessageBucket("10月", 100, 10000000)); list.add(new MessageBucket("11月", 200, 100000000)); list.add(new MessageBucket("12月", 300, 1000000000)); // 1年の給料と出費を計算 int salary = 0; int expense = 0; for(MessageBucket msgBucket : list) { salary += msgBucket.getSalary(); expense += msgBucket.getExpense(); } bucket.setMsgBucket(new MessageBucket("わんわんお", salary, expense)); bucket.setMsgList(list); PageInfo pageInfo = new PageInfo(); pageInfo.setDate(new Date()); pageInfo.setPageTitle("サンプルページですよ☆ミ"); try { Velocity.setProperty("file.resource.loader.path", TEMPLATE_FILE_DIRECTORY); Velocity.init(); VelocityContext context = new VelocityContext(); context.put("pageInfo", pageInfo); context.put("dataBucket", bucket); Template tmplate = Velocity.getTemplate("sample2.vm", "MS932"); tmplate.merge(context, writer); } catch (Exception e) { System.out.println(e); } System.out.println("■結果を出力"); System.out.print(writer.toString()); } } |
DataBucket.java |
import java.util.List; public class DataBucket { private List<MessageBucket> msgList; private MessageBucket msgBucket; /** 挨拶メッセージを返すメソッド */ public String getGreeting() { return "ゆがみねぇな(挨拶)"; } /** もらってる給料により、感想を返します */ public String evaluateSalary(int salary) { if (salary < 1) { return "へいどうぞ!"; } else if (salary < 500) { return "最後は仕方ない"; } else if (salary < 700) { return "芋が無いと失礼だ"; }else if (salary < 5000) { return "超スピード!!!!!!"; } else { return "仕方ないね"; } } public void setMsgList(List<MessageBucket> msgList) { this.msgList = msgList; } public List<MessageBucket> getMsgList() { return msgList; } public void setMsgBucket(MessageBucket msgBucket) { this.msgBucket = msgBucket; } public MessageBucket getMsgBucket() { return msgBucket; } } |
MessageBucket.java |
public class MessageBucket { private String name; private int salary; private int expense; public MessageBucket(String name, int salary, int expense) { this.name = name; this.salary = salary; this.expense = expense; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setSalary(int salary) { this.salary = salary; } public int getSalary() { return salary; } public void setExpenses(int expense) { this.expense = expense; } public int getExpense() { return expense; } } |
PageInfo.java |
import java.util.Date; public class PageInfo { private String pageTitle; private Date date; public void setPageTitle(String pageTitle) { this.pageTitle = pageTitle; } public String getPageTitle() { return pageTitle; } public void setDate(Date date) { this.date = date; } public Date getDate() { return date; } } |
実行結果
■結果を出力 ----------------------------------- サンプルページですよ☆ミ (Fri Nov 04 01:15:43 JST 2011) 「わんわんお」さん 今年の収入 : 5100 今年の出費 : 1111122210 詳細: <1> 1月: 収入 : 100 出費 : 100 <2> 2月: 収入 : 200 出費 : 1000 <3> 3月: 収入 : 300 出費 : 10000 <4> 4月: 収入 : 400 出費 : 10 <5> 5月: 収入 : 500 出費 : 100 <6> 6月: 収入 : 600 出費 : 1000 <7> 7月: 収入 : 700 出費 : 10000 <8> 8月: 収入 : 800 出費 : 100000 <9> 9月: 収入 : 900 出費 : 1000000 <10> 10月: 収入 : 100 出費 : 10000000 <11> 11月: 収入 : 200 出費 : 100000000 <12> 12月: 収入 : 300 出費 : 1000000000 給料に対する感想 : へいどうぞ! 給料に対する感想 : 最後は仕方ない 給料に対する感想 : 最後は仕方ない 給料に対する感想 : 芋が無いと失礼だ 給料に対する感想 : 超スピード!!!!!! 給料に対する感想 : 仕方ないね ----------------------------------- |