Java ベースのテンプレートエンジン Velocity を使ったメモ

少し前の案件で、Velocity (ヴェロシティ) という Java ベースのテンプレートエンジンを使った。そこで、「基本的な使い方」というよりはトラブルシューティング的な知識、逆引きで引っかかったところをまとめておく。

Eclipse で Velocity を扱う時は VeloEdit を入れておくとシンタックスハイライトされる

Eclipse の「ヘルプ」メニューの所からインストールできる。シンタックスハイライトはあんまり細かく設定できないので、気休め程度で。

#if 文の中の Velocity 変数には ! を付けても付けなくても変わらない

#if 文の中では、Velocity 変数は先に存在チェックを行われて真偽値を返すので、$hoge あるいは ${hoge} と書いても、値が null の時に無視される $!{hoge} という書き方をしても、扱いは同じになる。

変数に型が明示されていない感覚は JavaScript に近いかもしれない。

#if(${hoge})
  ## Velocity 変数 hoge が null の場合は falsenull でない場合は true
  ## 変数が未定義な場合は null と見なされるので false となる
#end

#if($!{hoge} > 50)
  ## 「!」の有無は動きに関係ない。
  ## 変数が未定義や null の場合は単純に条件を満たさないので、この式は false 扱いになる
#end

僕は変数は必ず $!{hoge} の形式で書くように統一していた。

文字列は == で比較して良いっぽい

#if($!{hogeStr} == "HOGEFUGA")
  ## 処理
#end

equals() を使うのかなと思ったのだけど、ネット上で文献を漁ってもそういうサンプルが見つからず。結局 == で比較しても問題なく動作していたのでそうしてしまった。

#include は静的読み込み、#parse はテンプレートとして読み込み

別ファイルを読み込む時の方法が2つある。

#inclde は単にテキストとして挿入するイメージなので、中に Velocity の構文が書いてあっても処理されず、そのままテキストとして展開される。

#parse はテンプレートとして処理して読み込む。

## 変数をセットしておくと…
#set($hoge = "HOGE")

## Parse する別ファイル内で $hoge が参照できる
#parse("another.vm")

  ## もし別ファイル内で何か変数を宣言していたら…
  #set($another = "ANOTHER")

## Parse を書いた元ファイルから $another が参照できる
<p>$!{another}</p>

jQuery を混ぜ込みたい時は jQuery() で書くか #include する

jQuery が使う $ という変数名が Velocity 変数と被るので、Velocity テンプレート内に jQuery を書いたり、#parse 読み込みしたりすると正しく処理されなくなる。

そのため、手間だが jQuery() で書くようにするか、#include で静的読み込みできるようにしておくと良いと思う (まぁ最初から .js ファイルとして外出しすれば良いのだが…)。

Integer.parseInt() などしたい時は

Integer を Velocity Template に送らなきゃ…とか思ったけど、コレで行ける。

## 適当な数値型の変数を作り、コレを Integer のライブラリとして使う
#set($MyInteger = 0)

$Integer.parseInt($!{hogeStr})

変数名はそのまんま Integer にしてしまっても良い。

その他参考