Velocity

Velocityについて

コミュニティ

ドキュメント

比較

ツール

日本語訳について

Table of Contents
  1. このガイドについて
  2. Velocityとは?
  3. Velocityは何ができるの?
    1. The Mud Store のサンプル
  4. Velocity テンブレート言語 (VTL): はじめに
  5. Hello Velocity World!
  6. コメント
  7. 参照
    1. 変数
    2. プロパティ
    3. メソッド
  8. 正式なリファレンス記法
  9. Quiet リファレンス記法
  10. リテラルを得る
    1. 通貨
    2. VTLリファレンスをエスケープする
  11. 大文字小文字置換
  12. 指示子
    1. Set
    2. 文字列リテラル
    3. If-Else 文
      1. 関連と論理演算子
    4. Foreach ループ
    5. Include
    6. Parse
    7. Stop
    8. Velocimacros
  13. VTL 指示子をエスケープする
  14. VTL: フォーマット問題
  15. その他の機能
    1. Math
    2. 範囲演算子
    3. 高度な問題: エスケープと !
    4. Velocimacro いろいろ
  16. フィードバック


About this Guide

Velocity ユーザー・ガイドは、ページ・デザイナーおよび、コンテンツ・プロパイダーが、 単純だけれども、強力なスクリプト言語である Velocity とその Velocity テンプレート言語 (VTL) の構文を知るために役立つガイドにするつもりです。 このガイドは、Web サイトにおいて動的に内容を埋め込むために Velocity を使う 多くの例を扱っていますが、全ての VTL の例は同様に他のページやテンプレートに適用できます。

Velocity を選択してくれてありがとう!


What is Velocity?

Velocity は、Java ベースのテンプレートエンジンです。 それは Java コードで定義されたメソッドを参照することを Web ページデザイナーに許します。 Model-View-Controller(MVC) モデルにより Web サイトを開発するので Java プログラマと Web デザイナーが平行に作業することができるため Web ページ・デザイナーはサイトの見栄えをつくることだけに集中し、 プログラマーが最高のコードを書くことだけに集中することができることを意味します。 Velocity は、Java コードを Web ページから切り離し、長い目で見れば、より保守しやすい Web サイトを作成し、 Java Server Pages(JSP) や PHP の実行可能な代案を提供します。

Velocity の可能性は、Web サイトの領域を越えて広がります; 例えば、テンプレートから SQL と PostScript と XML(XML変換の詳細は Anakia を参照のこと) を生成することができます。 また、独立したユーティリティとして、ソース・コードを生成したり、レポートを生成したり、 他のシステムとの統合をするためのコンポーネントとして使用することができます。 Velocityはまた、テンプレート・サービスをTurbine Web アプリケーション・フレームワークのために用意しています。 Velocity+Turbine は、本当の MVC モデルにより開発される Web アプリケーションを構築できるテンプレート・サービスを提供します。


What can Velocity do for me?
The Mud Store Example

あなたが泥を売ることを専門に扱うオンライン・ストアの ページ・デザイナーであるとしましょう。 それを「オンライン泥ストア」としましょう。 ビジネスは、成功しています。 顧客の立場では、いろいろな種類の泥や量を発注します。 彼らは、あなたのサイトに自分の名前とパスワードを使用してログインし 発注したものを確認して見たり、さらに泥を購入することが出来ます。 現在、テラコッタ泥は発売中で、それはとても人気があります。 あなたの顧客の少数派は、定期的に明るい赤泥(それはまた、発売中です)を買います人気があり、そして、通常あなたのWebページのマージンに任せられる。 各々の顧客に関する情報はある日、問題が起こるように、あなたのデータベースにおいてたどられてす、泥のそれらのタイプに最も興味を持っている顧客に、泥の上で特別な処置を目標とするために Velocity を使いませんか?

Velocity は、あなたのオンライン訪問者に対してカスタマイズした Web ページを簡単に作成することができます。 「The Mud Room」での Web サイト・デザイナーとして、あなたは顧客があなたのサイトに ログイン後に見る Web ページを作りたいのです。

あなたはあなたの会社でソフトウェア・エンジニアに会います、そして、 誰でも $customer が現在ログインしている顧客に関係する情報を 保持し、$mudsOnSpecial が現在発売中の全てのタイプの泥の 情報を保持することに同意しました。 $flogger オブジェクトは、宣伝を手伝うメソッドを含みます。 当面の作業のために、これらの3つのリファレンスだけに注目しましょう。 覚えていてください、あなたはソフトウェア・エンジニアが必要な情報を データベースから抜き取る方法について心配する必要がありません、 あなたはそれが働くということを知っている必要があるだけです。 これは、あなたは自分の仕事に取り掛かり、ソフトウェア・エンジニアには 彼らの仕事に取りかからせることになります。

あなたは、以下の VTL 文を Web ページに埋め込みます。

<HTML>
<BODY>
Hello $customer.Name!
<table>
#foreach( $mud in $mudsOnSpecial )
   #if ( $customer.hasPurchased($mud) )
      <tr>
        <td>
          $flogger.getPromo( $mud )
        </td>
      </tr>
   #end
#end
</table>

foreach文の正確な詳細は、簡素により素晴らしく深く記述されることになります; 重要なことは、この短いスクリプトをあなたの Web サイトに提供できるという衝撃です。 Bright Red Mud を好む顧客がログインして、Bright Red Mud がセール中であるときに、 この顧客は、特に目につくように表示されたものを見ることになります。 テラコッタ泥購入の長い歴史をもつ別の顧客がログインしたときには、 テラコッタ泥販売の通知は、正面の真中に表示されます。 Velocityの柔軟性は、たいへん強力なので、制限はあなたの創造力だけです。

集合的にあなたにあなたがあなたの Web サイトに Web presenceを作るために必要とするパワーと柔軟性を与える多くの他の Velocity 要素は、VTLリファレンスにおいて文書化されます。 あなたがこれらの要素により精通しているようになるので、あなたは Velocity のパワーを発揮し始めることになります。



Velocity Template Language (VTL): An Introduction

Velocityテンプレート言語(VTL) は、動的に内容をWebページに取り入れるために最も簡単で、最も単純で最もきれいな方法を提供するはずです。 ほとんどプログラミング経験のないWebページ開発者さえ、すぐに動的な内容をWebサイトに取り入れるために VTL を使うことができるはずです。

VTL は Web サイトにおいて動的な内容を埋め込むためにリファレンスを使います、そして、変数はリファレンスの1つの型です。 変数は Java コードにおいて定義される何かを呼び出すことができるリファレンスの1つの型です、あるいは、それは Web ページにおいて VTL からその値のためにそれ自体を得ることができます。 HTML 文書に埋め込むことができる VTL 文の例は、ここにあります:

#set( $a = "Velocity" )

全ての VTL 文と同様に、この VTL 文は、#文字から始まって、set指令を含みます。そのとき、オンライン訪問客があなたのWebページを要求したとき、Velocity テンプレート・エンジンが、あなたの Web ページを通して、それから全ての#文字を捜し、VTL 文の始めか、#文字がVTLに関係していないのかを決定します。

#文字は、指示(set)がつづきます。 set指示は、式(括弧で囲まれた)(変数に割り当てる式)を使います。 変数は、左側で、その値は右側になります。この2つは、= 文字によって区切られます。

上の例で、変数は $a です、そして、値は Velocity です。 全てのリファレンスの様に、この変数は、$ 文字から始まります。 値は、常に引用符で囲まれます; Velocity では、文字列(テキストに基づく情報)だけが変数に渡される ので、データ型に対する混乱は発生しません。

以下の簡単なルールは、Velocity がどのように働くかについて理解しやすいでしょう。: リファレンスは、$ から始まって、何かを得るために使われます。 指令は、# から始まって、何かを行うために使われます。

上の例では、#set は、値を変数に割り当てるために使われます。 変数($a)は、「Velocity」のテンプレートで出力するのに使う ことができます。


Hello Velocity World!

一旦値が変数に割り当てられるならば、あなたはあなたの HTML 文書においてどこにでも変数を参照することができます。 下記の例では、値は $foo に割り当てられて、後で参照されます。

<html>
<body>
#set( $foo = "Velocity" )
Hello $foo World!
</body>
<html>

結果として Web ページは、"Hello Velocity World!"を表示します。

VTL 指令を含んだステートメントをより読みやくするために、個々の VTL 文は、 新しい行から開始することを推奨しますが、これはもちろん強制ではありません。 set指令は、後ほど更に詳細に説明します。


Comments

テンプレート・エンジンの出力に含まれないように、テキストを説明するための コメント含めることができます。 コメントは、あなた自身に思い出させてたり、あなたの VTL 文が何をしているかについて 説明したり、その他の目的に使うことができます。下記は、VTL でのコメントの例です。

## This is a single line comment.

一行コメントは、## から始まり、行末まで続きます。 複数行のコメントを書くのには、たくさんの一行コメントは必要ありません。 複数行コメント(それは #* ではじまり、*# で終了します)は、 そのような場合に利用できます。

This is text that is outside the multi-line comment. 
Online visitors can see it.

#*
 Thus begins a multi-line comment. Online visitors won't 
 see this text because the Velocity Templating Engine will
 ignore it.
*#

Here is text outside the multi-line comment; it is visible.

一行コメントと複数行コメントの有効範囲を明確にする2、3の例は、ここにあります:

This text is visible. ## This text is not.
This text is visible.
This text is visible. #* This text, as part of a multi-line comment, 
is not visible. This text is not visible; it is also part of the 
multi-line comment. This text still not visible. *# This text is outside 
the comment, so it is visible.
## This text is not visible.

コメント (VTLコメント・ブロック) の第3のタイプがあります。 それは文書著者とバージョン情報などを格納するために使われるかもしれません:

#**
This is a VTL comment block and
may be used to store such information
as the document author and versioning
information:
@author
@version 5
*#


References

VTL には、3種類のリファレンスのタイプがあります: 変数とプロパティとメソッドです。 VTL を使っているデザイナーとして、あなたがあなたのテンプレートで正しくそれらを使うことができるように、あなたとあなたのエンジニアはリファレンスの特定の名前に関する合意をしなければなりません。

リファレンスへ/からやって来るものすべては、文字列オブジェクトとみなされます。 $foo(例えば整数オブジェクト)を表すオブジェクトがあるならば、Velocity はオブジェクトを文字列に分解するためにその.toString()メソッドを呼ぶことになります。

変数
変数の短縮形表記法は、「$」文字に続くVTL 識別子から構成されます。 VTL 識別子は、英字から始めなければなりません(a..zまたはA..Z)。 文字の残りは、以下の文字のタイプ限定されます:

  • アルファベット (a .. z, A .. Z)
  • 数字 (0 .. 9)
  • ハイフン ("-")
  • アンダースコア ("_")

ここに、いくつかの有効な VTL での変数リファレンスの例があります。

$foo
$mudSlinger
$mud-slinger
$mud_slinger
$mudSlinger1

$fooのように、VTL が変数を参照するとき、テンプレートまたは Java から指示的な set がコード化するどちらからでも、変数はその値を得ることができます。 例えば、テンプレートが要求される時、Java 変数 $foo が値 bar を持つならば、bar は Web ページ上で $foo の全てのインスタンスと置き換えられます。 代わりに、私はステートメントを含ます

#set( $foo = "bar" )

出力は、この指令以降の $foo の全てのインスタンスは同じになります。

Properties
VTL リファレンスの第二の特色は、プロパティと特徴的なフォーマットを持つプロパティです。 短縮形表記法は、$文字に続く VTL 識別子と、ドット「.」によってつづく別の VTL 識別子 があります。 これらは、VTL での有効なプロパティ・リファレンスの例です:

$customer.Address
$purchase.Total

最初の例($customer.Address)をみてください。 それは、2つの意味を持つことができます。 それは意味することができます ― customer と確認される hashtable で見てください、そして、キー Address と関連される値を返してください。 しかし、$customer.Address は、また、メソッド(メソッドを呼ぶリファレンスは、次のセクションにおいて検討されることになります)を呼ぶことができます; $customer.Address は、$customer.getAddress() を書くことの略記された方法でもあります。 あなたのページが要求されるとき、Velocity はこれらの2つの可能性のうちどちらが意味をなすかについて決定して、それから適切な値を返します

Methods
メソッドは Java コードにおいて定義されて、役に立つ何かをすることができます、計算を実行するか、決定で到着するのが好きにしてください。 メソッドは「$」文字で始まり、それに続く VTL 識別子と、それに続く VTL Method Body から構成されるリファレンスです。 VTL Method Body は、VTL 識別子と左括弧文字("("と、それに続くオプションのパラメータ・リスト、それに続く右括弧(")")から構成されます。 これらは、VTL での有効なメソッド・リファレンスの例です:

$customer.getAddress()
$purchase.getTotal()
$page.setTitle( "My Home Page" )
$person.setAttributes( ["Strange", "Weird", "Excited"] )

最初の2つの例($customer.getAddress()$purchase.getTotal())は、上のプロパティ・セクション($customer.Address$purchase.Total)において使われるそれらに類似したように見えるかもしれません。 あなたがこれらの例が関係がなければならないと思うならば、若干の流儀の中のいくつか、あなたは正しいです!

VTL プロパティが、VTL メソッドのために短縮形表記法として使われることができます。 プロパティ $customer.Address は、 メソッド$customer.getAddress() を使いながら正確な同じ効果を持ちます。 利用できるとき、一般にプロパティを使うことが、好ましいです。 プロパティとメソッドの主な違いは、あなたがメソッドにパラメータ・リストを指定することができるということです。

短縮形表記法は、以下のメソッドで使うことができます

$sun.getPlanets()
$annelid.getDirt()
$album.getPhoto()

我々は、これらのメソッドが太陽に属している惑星の名前を返すか、 我々のミミズに餌をやるか、アルバムから写真を得るのを期待するかもしれません。 以下のメソッドは、長い表記法だけが動作します。

$sun.getPlanet( ["Earth", "Mars", "Neptune"] )
## Can't pass a parameter list with $sun.Planets

$sisyphus.pushRock()
## Velocity assumes I mean $sisyphus.getRock()

$book.setTitle( "Homage to Catalonia" )
## Can't pass a parameter list

Formal Reference Notation
リファレンスのための短縮形表記法が上でリストされる例のために使われました、しかし、形式的な表記法がまた、リファレンスのためにあります。そして、それはデモをされます:

${mudSlinger}
${customer.Address}
${purchase.getTotal()}

ほとんどすべての場合には、あなたはリファレンスのために短縮形表記法を使用することになります、しかし、若干の場合には、形式的な表記法は正しい処理のために必要です。

$viceが文の名詞でベース語として使われることになっていた所で、 あなたが飛んで文を構成していたと思ってください。 目的は、ベース語を選ぶ誰かを許して、以下の2つの結果のうちの1つを生じることです: 「Jack is pyromaniac.」、あるいは、「Jack is kleptomaniac.」となります。 短縮形表記法を使用することは、この作業に不適当です。 以下の例を考えてみてください:

Jack is a $vicemaniac.

ここに曖昧さがあり、そして、Velocity は$viceではなく、 $vicemaniac があなたが使うつもりである識別子であると仮定します。 $vicemaniac のために値が見つからず、 それは $vicemaniac を返すことになります。 形式的な表記法を使用することで、この問題を解決することができます。

Jack is a ${vice}maniac.

これで、Velocity は$vicemaniacではなく、$viceがリファレンスであるということが認識できます。 リファレンスがテンプレート中でテキストと直近のとき、形式的な表記法は多くの場合役に立ちます。

Quiet Reference Notation
Velocity が未定義リファレンスに遭遇したとき、その標準的な挙動はリファレンスのイメージを出力します。 例えば、以下のリファレンスは VTL テンプレートの一部として現れると思ってください。

<input type="text" name="email" value="$email"/>

最初にフォームがロードされるとき、変数のリファレンス $email には値がありません、 しかし、あなたは「$email」という値より空白のテキスト・フィールドを好みます。 Silentリファレンス表記法を使用することで、Velocity の標準的な挙動を回避します; VTL で $email を使う代わりに、あなたは $!email を使います。 それで、上記の例は、以下のように見えます:

<input type="text" name="email" value="$!email"/>

これで、フォームの初期読み込みで、$email がまだ値を持たないとき、 「$email」の替わりに空の文字列が出力されます。

形式的なリファレンスと Silent リファレンス表記法を一緒に使うことができます。 それは以下でデモされます。

<input type="text" name="email" value="$!{email}"/>


Getting literal

VTL は、$# というよな特別な文字を使用するので、 あなたのテンプレートでこれらの文字を使用する場合には注意が必要です。 このセクションでは、$ 文字をエスケープする方法を説明します。

通貨
「私は、たった$2.50ドルで農夫の市場で、4ポンド入りのジャガイモの袋を買いました!」 と書くことについては問題はありません。 VTL識別子は常に大文字または小文字の英字から始まるので、$2.50はリファレンスと間違えることはありません。

Escaping Valid VTL References
Velocity が混乱する可能性がある所で、発生するかもしれません。 エスケープ特別な文字、あなたのテンプレートとこれでの VTL の特別な文字が バックスラッシュ(\)を使って、正当に扱われることができるハンドルに最高の方法は、 文字です。

#set( $email = "foo" )
$email

Velocity があなたの VTL テンプレートで$emailリファレンスを検出すると、 それは対応する値を求めてコンテキストを捜すことになります。 ここでは、$email が定義されるので、出力は foo になります。 $email が定義されないならば、出力は $email になります。

$email が定義される(例では値 foo を持ちます)、 そして、あなたが $email を出力したいと仮定します。 これを行なう2、3の方法があります、しかし、最も単純なものはエスケープ文字を使うことです。

## The following line defines $email in this template:
#set( $email = "foo" )
$email
\$email
\\$email
\\\$email

このようにレンダリングされます

foo
$email
\$email
\\$email

\ 文字が左から $ まで縛ることに注意してください。 bind-from-left 規則は、\\\$email として提出する \\$email を引き起こします。 これらの例を $email が定義されないそれらと比較してください。

$email
\$email
\\$email
\\\$email

renders as

$email
\$email
\\$email
\\\$email

Velocity は、定義されなかったものと定義されものとでリファレンスの扱いが異なる ことに注意してください。 $foo に値 gibbous を与えるセットされた指令は、ここにあります。

#set( $foo = "gibbous" )
$moon = $foo

出力が、次のようになります。 $moon = gibbous -- ここで $moon は、リテラルとして出力されます。 というのは、それは未定義で、$foo の場所には gibbous が出力されるからです。

VTL 指令をエスケープすることも、可能です; これは、指令セクションにおいて更に詳細に記述されます。


Case Substitution

あなたがリファレンスに精通している今、あなたはあなたのテンプレートで効果的にそれらを適用し始めることができます。 Velocity リファレンスは、テンプレート・デザイナーが使いやすいと見つけることになる若干の Java 原則を利用します。 例:

$foo

$foo.getBar()
## is the same as
$foo.Bar

$data.getUser("jon")
## is the same as
$data.User("jon")

$data.getRequest().getServerName()
## is the same as
$data.Request.ServerName
## is the same as
${data.Request.ServerName}

これらの例は、同じリファレンスの他の用途を図示します。 Velocity は、コンテキストで両方のオブジェクトにオブジェクト・メソッドと同様にリファレンス名を分解するために Java の introspection と bean 機能を利用します。 あなたのテンプレートに埋め込んで、ほとんどどこにでもリファレンスを評価することは、可能です。

Velocity(それはサン・マイクロシステムズによって定義される bean 仕様書にならって作られます)は、大文字と小文字の区別がされます; しかし、開発者はユーザー・エラーを捕えて、訂正するために努力するようにすることが可能です。 メソッドgetFoo()$bar.fooによってテンプレートで呼ばれるとき、Velocityは最初に$getfooを試みることになります。 これが失敗するならば、それはそれから$getFooを試みることになります。 同じように、テンプレートが$bar.Fooを呼ぶとき、Velocityは最初に$getFoo()を試みることになって、それからgetfoo()を試みることになります。

注意: テンプレートのインスタンス変更への参照は、解決されません。 JavaBean と同様な属性への参照のみの getter/setter メソッドが解決されます。 (つまり、$foo.Nameは、クラス Foo の getName() インスタンスメソッドの解決されますが、Foo のインスタンス変更である public Name ではありません。)


Directives

リファレンスは、Web サイトに動的に内容を生成するためにテンプレート・デザイナーを許します。directives− 創造的に Java コードの出力を操作するために使われることができる使いやすいスクリプト要素−は、 Web デザイナーが本当に Web サイトの内容と見栄えを引き受けることができるようにします。

#set

#set 指示子は、リファレンスの値をセットするために使われます。 値はリファレンス変数かプロパティ・リファレンスに割り当てられることができます、そして、これは括弧内で起こります。そして、そのことはデモをしました:

#set( $primate = "monkey" )
#set( $customer.Behavior = $primate )

左辺(LHS)は、可変のリファレンスまたはプロパティ・リファレンスでなければなりません。 右辺(RHS)は、以下のタイプのうちの1つでありえます:

  • 変数リファレンス
  • 文字列リテラル
  • プロパティリファレンス
  • メソッド・リファレンス
  • 数値リテラル
  • 配列リスト

これらの例は、前記のタイプの各々を示します:

#set( $monkey = $bill ) ## variable reference
#set( $monkey.Friend = "monica" ) ## string literal
#set( $monkey.Blame = $whitehouse.Leak ) ## property reference
#set( $monkey.Plan = $spindoctor.weave($web) ) ## method reference
#set( $monkey.Number = 123 ) ##number literal
#set( $monkey.Say = ["Not", $my, "fault"] ) ## ArrayList

注意: 要素が定義した最後の例で [..] ArrayList クラスで定義されるメソッドを使用してアクセスできるオペレーターは、います。 それで、例えば、あなたは $monkey.Say.get(0) を使うことより上に最初の要素にアクセスすることができます。

RHSは、また、単純な算術式でありえます:

#set( $value = $foo + 1 )
#set( $value = $bar - 1 )
#set( $value = $foo * $bar )
#set( $value = $foo / $bar )

他の Velocity 指令の一部と違って、#set 指示には、 #end ステートメントがありません。

String Literals

#set 指示を使うとき、文字列リテラルは、 ダブルクオート文字で囲む場合には、以下に示すようにレンダリングされます。

#set( $directoryRoot = "www" )
#set( $templateName = "index.vm" )
#set( $template = "$directoryRoot/$templateName" )
$template

出力はこうなります

www/index.vm

しかし、文字列リテラルがシングルクオートで囲まれている場合には、 解析されません。

#set( $foo = "bar" )
$foo
#set( $blargh = '$foo' )
$blargh
  bar
  $foo

デフォルトで、テキストを解析されないようにするシングルクオートを使ったこの機能は、 Velocity で利用できます。 このデフォルトは、velocity.properties を編集して stringliterals.interpolate=false とすることによって変更することができます


Conditionals
If / ElseIf / Else

Velocity の #if 指示子は、Web ページの生成時に if 文の条件が真でのときに、テキストが生成されます。 例:

#if( $foo )
   <strong>Velocity!</strong>
#end

変数 $foo はそれが true かどうか決定するために評価されます。 そして、それは2つの状況のうちの1つの下で起こることになります: (i) $foo は true の値を持つ boolean(true/false)です、 あるいは、(ii) 値は null ではありません。 この場合、$foo が true ならば、出力があることになります: 「Velocity!」。$foo が null または、boolean で false ならば、 文の評価は false となり、出力はありません。

#elseifまたは#else要素が、#if要素と共に使用されます。 注意: Velocity テンプレートエンジンは、最初に式が true になったところで止まります。 下記の例では、$foo が値として 15 を持ち、$bar は値として 6 を持つとします。

#if( $foo < 10 )
    <strong>Go North</strong>
#elseif( $foo == 10 )
    <strong>Go East</strong>
#elseif( $bar == 6 )
    <strong>Go South</strong>
#else
    <strong>Go West</strong>
#end

この例では、$foo は、10 より大きい場合に、 最初の 2 つの比較は失敗します。次に、$bar が、6 と比較され、 それが true なので、出力は、Go South となります。

注意: 現在、Velocity の数の比較は整数まで切り上げされます -- そうでない場合には false と評価することになります。 これに対する唯一の例外は等号「==」です、Velocity は、「==」の両辺に存在する 各々のオブジェクトは、同じクラスを要求します。

Relational and Logical Operators

Velocity は、変数の関係を決定するために等号オペレーターを使います。 等号オペレーターが使われる方法を図示する単純な例は、ここにあります。

#set ($foo = "deoxyribonucleic acid")
#set ($bar = "ribonucleic acid")

#if ($foo == $bar)
  In this case it's clear they aren't equivalent. So...
#else
  They are not equivalent and this will be the output.
#end

Velocity には、同様に論理 AND と論理 OR 演算子があります。 以下は、if 文で論理 AND を使用した例です。

#if( $foo && $bar )
   <strong>Velocity Rocks!</strong>
#end

if 文は、$foo$bar が共に true かどうか、 評価します。 $foo が false ならば、式全体は false に評価され $bar は、評価されません。 $foo が true ならば、Velocity テンプレートエンジンは、 次に $bar の値をチェックすることになります。 $bar が true ならば、式全体が、true となって Velocity Rocks! が出力されます。 $bar が false ならば、式全体が false となって 出力されません。

論理 OR 演算子は、式全体が true になるように評価をする必要があるリファレンス のひとつを除き同じように作用します。 以下の例を考えてみてください。

#if( $foo || $bar )
    <strong>Velocity Rocks Again!</strong>
#end

$foo が true ならば、Velocity テンプレートエンジンは $bar を調べる必要はありません; $bar が true であるか false であるかどうかに関係なく、 式が再び true となり Velocity Rocks Again!が出力されます。 $foo が false ならば、今度は $bar をチェックしなければなりません。 この場合、$bar がまた、false ならば、式は false と評価して、出力はありません。 一方、$bar が true ならば、式全体が true になり、出力は、Velocity Rocks Again! となります。


Loops
Foreach Loop

#foreach 要素は、ループができます。例えば

<ul>
#foreach( $product in $allProducts )
    <li>$product</li>
#end
</ul>

この #foreach ループによって、$allProducts リスト (オブジェクト)がリストにおいて製品(ターゲット)の全てでループにされるようになります。 ループによって、$allProducts からの値は $product 変数に置かれます。

$allProducts 変数の内容は、Vector、Hashtable または配列です。 $product 変数に割り当てられる値は、Java オブジェクトであって、 このように変数からリファレンスをつけられることができます。 たとえば、もし $product が本当に Java の Product クラスならば、 その名前は、$product.Name メソッドで参照して取り出すことができます。 (すなわち $Product.getName())。

$allProduct が Hashtable だとしましょう。もし Hashtable からキーの値を 取り出し、Hashtable 内のオブジェクトを取り出したい場合には、次のように コードを使用します。

 
   <ul> 
   #foreach( $key in $allProducts.keySet() ) 
       <li>Key: $key -> Value: $allProducts.get($key)</li> 
   #end 
   </ul> 
   

Velocity provides an easy way to get the loop counter so that you can do something like the following:

 
   <table> 
   #foreach( $customer in $customerList ) 
       <tr><td>$velocityCount</td><td>$customer.Name</td></tr> 
   #end 
   </table> 
   

ループカウンタ変数参照のためのデフォルト名は、velocity.properties ファイル に指定されている、$velocityCount です。カウンタのデフォルト値は 1 から開始しますが、0 や 1 に設定することが、velocity.properties ファイルで可能です。これは、velocity.properties ファイルの ループカウンタプロパティセクションにあります。

 
   # ループカウンタ変数参照のデフォルト名
   counter.name = velocityCount 
    
   # ループカウンタ変数山椒うのデフォルト開始値
   counter.initial.value = 1 
   


Include

#include スクリプト要素はローカル・ファイルをインポートするためにテンプレート・デザイナーを許します。そして、それはそれから #include 指示が定義される位置に挿入されます。 ファイルの中身は、テンプレートエンジンによってレンダリングされません。 セキュリティ上の理由のために、インクルードされるファイルは、 TEMPLATE_ROOT の下にあるだけかもしれません。

#include( "one.txt" )

#include 指示子が呼ぶファイルは、引用符において囲まれます。 複数のファイルをインクルードする場合には、それらをコンマで区切ります。

#include( "one.gif","two.txt","three.htm" )

インクルードされるファイルは、名前でリファレンスをつけられる必要はありません; 実際、多くの場合ファイル名でなく変数を使うことが、好ましいです。 ページ要求が提出されるとき、これは決定される基準によって出力を決定するのに役立ちます。 ここに、ファイル名と変数を示している例があります。

#include( "greetings.txt", $seasonalstock )


Parse

#parse スクリプト要素は、VTL を含むローカル・ファイルをインポートするためにテンプレート・デザイナーを許します。 Velocity は、VTL を解析することになって、指定されるテンプレートをレンダリングします。

#parse( "me.vm" )

#include 指示子のように、#parse は、テンプレートよりむしろ変数をとることができます。 #parse が呼ぶどんなテンプレートでも、TEMPLATE_ROOT の下で含まれなければなりません。 #include 指示子と違って、#parse は、ひとつの引数をとることになるだけです。

VTL テンプレートは、#parse ステートメントを持つ テンプレートの中からさらに #parse を呼ぶことができます。 デフォルトで10にセットされて、velocity.propertiesparse_directive.maxdepth 行は、一つのテンプレートから起こることができる最大数の#parse 参照数をカスタマイズするためにユーザーを許します。 (注: parse_directive.maxdepth プロパティが velocity.properties ファイルになければ、Velocity がこのデフォルトを 10 にセットします。)、 テンプレート dofoo.vm が以下の行を含むならば、 例えば、再帰は許されます:

Count down.
#set( $count = 8 )
#parse( "parsefoo.vm" )
All done with dofoo.vm!

それは、以下の VTL の内容のテンプレート parsefoo.vm を参照します。

$count
#set( $count = $count - 1 )
#if( $count > 0 )
    #parse( "parsefoo.vm" )
#else
    All done with parsefoo.vm!
#end

「Count down.」が表示された後、8 からカウントダウンして、 Velocity は parsefoo.vm を通してパスします。 カウントが 0 に達するとき、それは「All done with parsefoo.vm!」メッセージを表示します。 この時点で、Velocity はdofoo.vm に戻って、 「All done with dofoo.vm!」メッセージを出力します。


Stop

#stop スクリプト要素は、テンプレート・エンジンの実行を止めて、 戻るためにテンプレート・デザイナーを許します。 これは、デバックするときに役立ちます。

#stop


Velocimacros

#macro スクリプト要素は、VTL テンプレートの繰り返された部分を定義するためにテンプレート・デザイナーを許します。 Velocimacros は、両方とも単純で複雑な広範囲にわたるシナリオに、非常に役立ちます。 このVelocimacro(キーストロークを少なくして、印刷上のエラーを最小にする唯一の目的のためにつくられる)は、Velocimacro の概念の紹介を提供します。

#macro( d )
<tr><td></td></tr>
#end

この例で定義されている Velocimacro は d です、そして、 それは他の VTL指令 と同じような方法で呼び出すことができます:

#d()

このテンプレートが呼ばれるとき、Velocity は #d() を一つの、 空のデータ・セルを含んでいる列と置換します。

Velocimacro は引数(ゼロ引数は最初の例で省略可能だと示したので)はどんな数でもとることができますが、Velocimacro が呼び出されるとき、それは定義された同じ数の引数で呼ばれなければなりません。 ものが上記を定義したより、多くの Velocimacro は、含みます。 2つの引数として、色と配列をとる Velocimacro がここにあります。

#macro( tablerows $color $somelist )
#foreach( $something in $somelist )
    <tr><td bgcolor=$color>$something</td></tr>
#end
#end

この例(tablerows)で定義されている Velocimacro は、2つの引数をとります。 最初の引数は、$color となり、2番目の引数は、$somelist となります。

VTL テンプレートに入れられるものは何でも、Velocimacro の本体に入ることができます。 tablerows Velocimacro は、foreach 文です。 2つの #end 文が、#tablerows Velocimacro の定義にありますが、 最初の end は、#foreach のもので、二番目の end は Velocimacro 定義のものです。

#set( $greatlakes = ["Superior","Michigan","Huron","Erie","Ontario"] )
#set( $color = "blue" )
<table>
    #tablerows( $color $greatlakes )
</table>

$greatlakes$somelist に代わることに注意してください。 #tablerows Velocimacro がこの状況において呼ばれるとき、以下の出力が生成されます。

<table>
    <tr><td bgcolor="blue">Superior</td></tr>
    <tr><td bgcolor="blue">Michigan</td></tr>
    <tr><td bgcolor="blue">Huron</td></tr>
    <tr><td bgcolor="blue">Erie</td></tr>
    <tr><td bgcolor="blue">Ontario</td></tr>
</table>

Velocimacro は Velocity テンプレートで inline で定義ができますが、 同じ Web サイトで他の Velocity テンプレートには利用できません。 それが全てのテンプレートによって共有されることができるようなものは明らかにする Velocimacro を定義することは、利します: それは、作業を保存して、エラーの可能性を減らし、多数のテンプレートの上で Velocimacro を再定義する必要を減らして、複数のテンプレートが利用できるマクロに、それに一つの変更点を保証します。

Velocimacro Properties

velocity.propertiesファイルの中のいくつかの行は、Velocimacro の柔軟な実装のために許します。注意: 開発者ガイドも参照してください。

velocimacro.library − 全ての Velocimacro テンプレート・ライブラリのコンマで区切られたリスト。 デフォルトで、Velocity は一つのライブラリを捜します: VM_global_lib.vm。設定されたテンプレートパスは Velomacro ライブラリを検索するために使用されます。

velocimacro.permissions.allow.inline − このプロパティ(それは true または false の値)は、 Velocimacro が標準テンプレートで定義されることができるかどうか決定します。 デフォルト(true)は、テンプレートで Velocimacro を定義するためにテンプレート・デザイナーを許します。

velocimacro.permissions.allow.inline.to.replace.global − このプロパティ ( true または false ) は、Velocimacro が標準テンプレートで定義されることができるかどうか決定します。 デフォルト(true)は、テンプレートで Velocimacro を定義するためにテンプレート・デザイナーを許します。

velocimacro.permissions.allow.inline.local.scope − このプロパティは、true もしはく false で、デフォルトは false で、 Velocimacro 定義された inline がテンプレートを定義することだけに「見えるか」どうか制御します。 言い換えると、正しく調整するこのプロパティ・セットで、テンプレートはテンプレートを定義することによってだけ有用である inline VM を定義することができます。 あなたは装飾的な VM トリックのためにこれを使うことができます−グローバルな VM がグローバルな別の VM を呼ぶならば、inline 範囲で、テンプレートはそのテンプレートによって呼ばれるとき、最初の VM によって呼ばれることになる第二の VM のプライベート実装を定義することができます。 全ての他のテンプレートは、影響ありません。

velocimacro.context.localscope − このプロパティは、true または false が設定可能で、デフォルトは false です。 true のとき、Velocimacro の範囲内の #set() を経たコンテキストへのどんな修正でも Velocimacro に「ローカルである」と思われて、永久にコンテキストに影響を及ぼしません。

ここで、#tablerows($color $list) Velocimacro が Velocimacro テンプレートライブラリで定義てあり、このマクロはどの 標準テンプレートも使うこともできます。 それは、いつでもどんな目的でも使うことが出来ます。 テンプレートの mushroom.vm が全てのもの菌類のテンプレートで 提供されているとき、#tablerows Velocimacro は、 典型的なキノコの一部をリストするために呼び出すことができます:

#set( $parts = ["volva","stipe","annulus","gills","pileus"] )
#set( $cellbgcol = "#CC00FF" )
<table>
#tablerows( $cellbgcol $parts )
</table>

mushroom.vm の要求を満たすとき、Velocity は #tablerows Velocimacro をテンプレートライブラリ (velocity.properties ファイルにおいて定義される)で見つけて、 以下の出力を生成します: