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. 高度な問題: エスケープと !
  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」の替わりに空の文字列が出力されます。

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

<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()を試みることになります。


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

NOTE: 要素が定義した最後の例で [..] 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

デフォルトで、unparsedされたテキストをするシングルクオートを使うこの機能は、 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 となり、出力はありません。

An #elseif or #else element can be used with an #if element. Note that the Velocity Templating Engine will stop at the first expression that is found to be true. In the following example, suppose that $foo has a value of 15 and $bar has a value of 6.

#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

論理オペレータには、論理ANDと論理ORはの2種類ありますが、まもなくVelocityに追加されます。以下は、if文で論理ANDを使用した例です。

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

ifステートメントは、$foo$barが共に true かどうか、 評価します。 $fooが false ならば、式は false に評価することになります; $barは、評価されません。 $fooが true ならば、Velocity Templatingエンジンは、 それから$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())。


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 referralsをカスタマイズするためにユーザーを許します。 (注: parse_directive.maxdepthプロパティがvelocity.propertiesファイルになければ、Velocityがこのデフォルトを10にセットします。)、テンプレートdofoo.vmが以下の行を含むならば、例えば、Recursionは許されます:

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(キーストロークを少なくして、印刷上のエラーを最小にする唯一の目的のためにつくられる)は、Velocimacrosの概念の紹介を提供します。

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

この例では定義されているVelocimacroはdです、そして、それは指示的な他のどのVTLにも類似している方法において呼ばれることができます:

#d()

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

Velocimacroは引数(ゼロ引数さえ最初の例がオプションであることを中で証明したので)はどんな数でもとることができますが、Velocimacroが呼び出されるとき、それはそれが定義された同じ数の引数で呼ばれなければなりません。 ものが上記を定義したより、多くのVelocimacrosは、含みます。 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のbodyに入ることができます。 tablerows Velocimacroは、foreachステートメントです。 2つの#endステートメントが、#tablerows Velocimacroの定義にあります; 第一は、#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>

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

Velocimacro Properties

velocity.propertiesファイルの中のいくつかの行は、Velocimacrosの柔軟な実装のために許します:

velocimacro.library − 全てのVelocimacroテンプレート・ライブラリのコンマで区切られたリスト。 デフォルトで、Velocityは一つのライブラリを捜します: VM_global_lib.vm リストの中の全てのテンプレート・ライブラリは、テンプレートパスで見つけられなければならない。

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

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

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

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

ここで、#tablerows($color $list) Velocimacroが Velocimacrosテンプレートライブラリで定義てあり、このマクロはどの 標準テンプレートも使うこともできます。 それは、いつでもどんな目的でも使うことが出来ます。 テンプレートの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ファイルにおいて定義される)で見つけて、以下の出力を生成します:

<table>
    <tr><td bgcolor="#CC00FF">volva</td></tr>
    <tr><td bgcolor="#CC00FF">stipe</td></tr>
    <tr><td bgcolor="#CC00FF">annulus</td></tr>
    <tr><td bgcolor="#CC00FF">gills</td></tr>
    <tr><td bgcolor="#CC00FF">pileus</td></tr>
</table>
Velocimacro Arguments

Velocimacros は、以下のVTL要素はどれでも引数として取ることができます。

  • リファレンス : すべて '$'で開始する
  • 文字列リテラル : "$foo" や 'hello'のようなもの
  • 数値リテラル : 1, 2 など
  • 整数範囲 : [ 1..2] や [$foo .. $bar]
  • オブジェクト配列 : [ "a", "b", "c"]
  • boolean 値 true
  • boolean 値 false

Velocimacrosに対する引数としてリファレンスを渡すとき、に注目してください、リファレンスは『名前が』渡されます。 これは、彼らの値がVelocimacroの中に各使用で『生成される』ことを意味します。 この機能は、メソッド呼び出しによるリファレンスを渡して、メソッドを各使用で呼んでおくためにあなたを許します。 例えば、以下に示すようにVelocimacroを呼び出すと

     #macro( callme $a )
         $a $a $a
     #end

     #callme( $foo.bar() )
   

結果として、リファレンス$fooのメソッドbar()は3回呼び出されます。

一見したところでは、この機能は驚くべきように見えます、 しかし、あなたがVelocimacrosの後に最初の動機づけを考慮に入れるとき ― 一般に使われたVTLの カット&ペーストの重複を除去するために ― それは意味をなします。 それは、Velocimacroへのステートフルなオブジェクト(例えばテーブル列に色をつけるために繰り返しシーケンスで色を生成するオブジェクト)を渡すようなことをすることができます。

あなたがこの機能を回避する必要があるならば、あなたは常に新しいリファレンスとしてのメソッドからの値を得て、それを渡すことができます:

     #set( $myval = $foo.bar() )
     #callme( $myval )
   
Velocimacro Trivia

現在、それらがテンプレートで最初に使われる前に、Velocimacrosは定義されなければなりません。 これは、あなたの#macro()宣言がVelocimacrosを使う前にやって来るなければらならないことを意味します。

これは、インライン #macro() 指令を含んでいるテンプレートを #parse() するときに 覚えておくことは重要です。 というのも、実行時に #parse() が発生し、パーサーで起こるからはテンプレートでのVM-見ている要素がパース時のVMであるかどうか決めます。そして、VM宣言の集合が動くことにはならならない#parse()-ingが予期されます。 これに打ち勝つために、単にVelocityに起動時にあなたのVMをロードさせるためにvelocimacro.library機能を使ってください。


Escaping VTL Directives

VTL指令は、ある意味で有効なVTLリファレンスに類似したバックスラッシュ文字(「\」)でエスケープすることができます。

## #include( "a.txt" ) renders as <contents of a.txt>
#include( "a.txt" )

## \#include( "a.txt" ) renders as \#include( "a.txt" )
\#include( "a.txt" )

## \\#include ( "a.txt" ) renders as \<contents of a.txt>
\\#include ( "a.txt" )

一つの指令(ステートメントのようなif-else-endで)において、 複数のスクリプト要素を含むVTL指令をエスケープするとき、特別な心配はとられるはずです。 典型的なVTL if-statementは、ここにあります:

#if( $jazz )
    Vyacheslav Ganelin
#end

$jazzが true ならば、出力はVyacheslav Ganelinです; $jazzが false ならば、出力がはありません。 スクリプト要素をエスケープすると、出力を変えます。 以下の場合を考えてください:

\#if( $jazz )
    Vyacheslav Ganelin
\#end

$jazzが ture か false かどうかに関係なく、 出力は「#if( $jazz)Vyacheslav Ganelin #end」;となるでしょう。 実際、全てのスクリプト要素がエスケープされるので、$jazz の真偽は決してチェックされません。 バックスラッシュは合法的にエスケープするスクリプト要素に先行すると思ってください:

\\#if( $jazz )
   Vyacheslav Ganelin
\\#end

この場合、$jazzが true ならば、出力は\ Vyacheslav Ganelin \です。 $jazzが false ならば、出力はありません。 スクリプト要素が適切にエスケープされていなけば、分岐が開始することに注意すること。

\\\#if( $jazz )
    Vyacheslave Ganelin
\\#end

ここでは、#ifはエスケープされます、しかし、#endが残っています。 endが多すぎるので、解析エラーを引き起こすことになります。


VTL: Formatting Issues

このユーザー・ガイドの中のVTLが改行と空白(下で示されるVTL)で多くの場合表示されるけれども

#set( $imperial = ["Munetaka","Koreyasu","Hisakira","Morikune"] )
#foreach( $shogun in $imperial )
    $shogun
#end

改行や空白が無関係というのを完全に図示するために、以下の断片は有効に等しいというのが、 Geir Magnusson Jr. によってVelocityにユーザー・メーリングリストに送られました:

Send me #set($foo = ["$10 and ","a cake"])#foreach($a in $foo)$a #end please.

Velocityの振る舞いは、余分な空白を飲み尽くすことです。 前の指令は、このように書くことができます:

Send me
#set( $foo = ["$10 and ","a cake"] )
#foreach( $a in $foo )
$a
#end
please.

または

Send me
#set($foo       = ["$10 and ","a cake"])
                 #foreach           ($a in $foo )$a
         #end please.

どちらの場合も出力は同じです。


Other Features
Math

Velocityは、set指示子でテンプレートで使うことができる少数の 組み込み演算機能を持ちます。 以下の式は、それぞれ加算、減算、乗算、除算の例です:

#set( $foo = $bar + 3 )
#set( $foo = $bar - 4 )
#set( $foo = $bar * 6 )
#set( $foo = $bar / 2 )

除算が実行されるとき、結果は整数となります。 どんな余りも、余り(%)オペランドを使うことによって得ることができます。

#set( $foo = $bar % 5 )

整数だけ(...-2、-1、0、1、2...)許されますVelocityでいつの実行している数学的な式; 非整数が使われるとき、それはログに記録されます、そして、null は出力として返されることになります。

Velocityは、ゼロ除算を扱うことの組み込まれた方法を持ちます。 下記の例では:

#set( $foo = 5 )
#set( $bar = $foo - 5 )
#set( $uhoh = $foo / $bar )
$uhoh

リファレンス$uhohは、ゼロによって割られる5の値を割り当てられます。 Velocityがこのテンプレートを提出するとき、出力があることになります:

$uhoh

デザイナーはsetが生成する文字列に注意すべきです。そして、それは範囲演算子によって使われる整数に変換されなければなりません。 この例は、そのような変換を示します:

#set($a = "7")
#set($b = $int.valueOf($a) + 10)
$b

この結果 17 なります。


Range Operator

範囲演算子は、#set#foreachステートメントと一緒に使うことができます。 範囲演算子は以下に説明する整数を含んでいるオブジェクト配列を生成に役立ちます:

[n..m]

nmには、生成する整数が必要です。 mが、nより大きいか、より小さいかは重要ではありません; より小さい場合には、範囲は単にカウントダウンします。 下記に範囲オペレーターの利用を示している例があります:

First example:
#foreach( $foo in [1..5] )
$foo
#end

Second example:
#foreach( $bar in [2..-2] )
$bar
#end

Third example:
#set( $arr = [0..1] )
#foreach( $i in $arr )
$i
#end

Fourth example:
[1..3]

以下の出力を生成します:

First example:
1 2 3 4 5

Second example:
2 1 0 -1 -2

Third example:
0 1

Fourth example:
[1..3]

#set#foreach指令とともに使われるとき、 4番目の例で示されるように範囲オペレーターが配列を生成するだけである ことに注意。

Webページ・デザイナーは、標準サイズのテーブルを作成することに関心がありますが、 テーブルを埋めるほどの充分なデータを用意できない場合には、範囲オペレータが 役に立ちます。


Advanced Issues: Escaping and !

リファレンスは!文字と、\エスケープ文字によって封じられた!文字 でリファレンスが取り扱われる特別な方法。

#set( $foo = "bar" )
$\!foo
$\!{foo}
$\\!foo
$\\\!foo

レンダリング結果はこうなります

$!foo
$!{foo}
$\!foo
$\\!foo

これを通常エスケープと比較してください、ここで、\$に先行します:

\$foo
\$!foo
\$!{foo}
\\$!{foo}

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

\$foo
\$!foo
\$!{foo}
\bar


Feedback

あなたがこのマニュアルにおけるミスを見つけたり、Velocityユーザー・ガイドと関係する他のフィードバックはJohn Casturaに電子メールを送ってください。 ありがとう!



このドキュメントは、 熊坂祐二 が訳しました。コメントがある場合は、 jajakarta-report@jajakarta.good-day.net までお願いします。
Copyright © 1999-2001, Apache Software Foundation