| <?xml version="1.0" encoding="UTF-8"?> | |
| <!-- | |
| Licensed to the Apache Software Foundation (ASF) under one | |
| or more contributor license agreements. See the NOTICE file | |
| distributed with this work for additional information | |
| regarding copyright ownership. The ASF licenses this file | |
| to you under the Apache License, Version 2.0 (the | |
| "License"); you may not use this file except in compliance | |
| with the License. You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, | |
| software distributed under the License is distributed on an | |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| KIND, either express or implied. See the License for the | |
| specific language governing permissions and limitations | |
| under the License. | |
| --> | |
| <document> | |
| <properties> | |
| <title>VTL Reference</title> | |
| <author email="jvanzyl@zenplex.com">Velocity Documentation Team</author> | |
| <author email="jcastura@apache.org">John Castura</author> | |
| </properties> | |
| <body> | |
| <section name="About this Guide" href="AboutthisGuide"> | |
| <p> | |
| This guide is the reference for the Velocity Template Language | |
| (VTL). For more information, please also refer to the <a | |
| href="user-guide.html">Velocity User Guide</a>. | |
| </p> | |
| </section> | |
| <section name="References" href="References"> | |
| <subsection name="Variables" href="Variables"> | |
| <p> | |
| Notation: | |
| </p> | |
| <p> | |
| <strong>$</strong> [ <strong>!</strong> ][ <strong>{</strong> ][ | |
| <strong>a..z</strong>, <strong>A..Z</strong> ][ <strong>a..z</strong>, | |
| <strong>A..Z</strong>, <strong>0..9</strong>, <strong>-</strong>, | |
| <strong>_</strong> ][ <strong>}</strong> ] | |
| </p> | |
| <p> | |
| Examples: | |
| </p> | |
| <ul> | |
| <li>Normal notation: <variable>$mud-Slinger_9</variable></li> | |
| <li>Silent notation: <variable>$!mud-Slinger_9</variable></li> | |
| <li>Formal notation: <variable>${mud-Slinger_9}</variable></li> | |
| </ul> | |
| </subsection> | |
| <subsection name="Properties" href="Properties"> | |
| <p> | |
| Notation: | |
| </p> | |
| <p> | |
| <strong>$</strong> [ <strong>{</strong> ][ <strong>a..z</strong>, | |
| <strong>A..Z</strong> ][ <strong>a..z</strong>, <strong>A..Z</strong>, | |
| <strong>0..9</strong>, <strong>-</strong>, <strong>_</strong> ]* | |
| <strong>.</strong>[<strong>a..z</strong>, <strong>A..Z</strong> ][ | |
| <strong>a..z</strong>, <strong>A-Z</strong>, <strong>0..9</strong>, | |
| <strong>-</strong>, <strong>_</strong> ]* [ <strong>}</strong> ] | |
| </p> | |
| <p> | |
| Examples: | |
| </p> | |
| <ul> | |
| <li>Regular Notation: $customer.Address</li> | |
| <li>Formal Notation: ${purchase.Total}</li> | |
| </ul> | |
| </subsection> | |
| <subsection name="Methods" href="Methods"> | |
| <p> | |
| Notation: | |
| </p> | |
| <p> | |
| <strong>$</strong> [ <strong>{</strong> ][ <strong>a..z</strong>, | |
| <strong>A..Z</strong> ][ <strong>a..z</strong>, <strong>A..Z</strong>, | |
| <strong>0..9</strong>, <strong>-</strong>, <strong>_</strong> ]* | |
| <strong>.</strong>[ <strong>a..z</strong>, <strong>A..Z</strong> ][ | |
| <strong>a..z</strong>, <strong>A..Z</strong>, <strong>0..9</strong>, | |
| <strong>-</strong>, <strong>_</strong> ]*<strong>(</strong> [ | |
| <i>optional parameter list...</i> ] <strong>)</strong> [ | |
| <strong> } </strong>] | |
| </p> | |
| <p> | |
| Examples: | |
| </p> | |
| <ul> | |
| <li>Regular Notation: $customer.getAddress()</li> | |
| <li>Formal Notation: ${purchase.getTotal()}</li> | |
| <li>Regular Notation with Parameter List: $page.setTitle( "My Home | |
| Page" )</li> | |
| </ul> | |
| </subsection> | |
| <p> | |
| VTL Properties can be used as a shorthand notation for VTL Methods | |
| that take <em>get</em> and <em>set</em>. Either | |
| <em>$object.getMethod()</em> or <em>$object.setMethod()</em> can be | |
| abbreviated as <em>$object.Method</em>. It is generally preferable to | |
| use a Property when available. The main difference between Properties | |
| and Methods is that you can specify a parameter list to a Method. | |
| </p> | |
| </section> | |
| <section name="Directives" href="Directives"> | |
| <subsection name="#set - Establishes the value of a reference" href="set-Establishesthevalueofareference"> | |
| <p> | |
| Format: | |
| </p> | |
| <p> | |
| <strong>#</strong> [ <strong>{</strong> ] <strong>set</strong> [ <strong>}</strong> ] <strong> ( $</strong>ref <strong>=</strong> [ <strong>"</strong>, | |
| <strong>'</strong> ]arg[ <strong>"</strong>, <strong>'</strong> ] ) | |
| </p> | |
| <p> | |
| Usage: | |
| </p> | |
| <ul> | |
| <li><em>$ref</em> - The LHS of the assignment must be a variable | |
| reference or a property reference.</li> | |
| <li><em>arg</em> - The RHS of the assignment, <em>arg</em> is parsed | |
| if enclosed in double quotes, and not parsed if enclosed in single | |
| quotes. If the RHS evaluates to <em>null</em>, it is <b>not</b> | |
| assigned to the LHS.</li> | |
| </ul> | |
| <p> | |
| Examples: | |
| </p> | |
| <ul> | |
| <li>Variable reference: #set( $monkey = $bill )</li> | |
| <li>String literal: #set( $monkey.Friend = 'monica' )</li> | |
| <li>Property reference: #set( $monkey.Blame = $whitehouse.Leak | |
| )</li> | |
| <li>Method reference: #set( $monkey.Plan = $spindoctor.weave($web) | |
| )</li> | |
| <li>Number literal: #set( $monkey.Number = 123 )</li> | |
| <li>Range operator: #set( $monkey.Numbers = [1..3] )</li> | |
| <li>Object array: #set( $monkey.Say = ["Not", $my, "fault"] )</li> | |
| </ul> | |
| <p> | |
| The RHS can also be a simple arithmetic expression, such as: | |
| </p> | |
| <ul> | |
| <li>Addition: #set( $value = $foo + 1 )</li> | |
| <li>Subtraction: #set( $value = $bar - 1 )</li> | |
| <li>Multiplication: #set( $value = $foo * $bar )</li> | |
| <li>Division: #set( $value = $foo / $bar )</li> | |
| <li>Remainder: #set( $value = $foo % $bar )</li> | |
| </ul> | |
| </subsection> | |
| <subsection name="#if/#elseif/#else-outputconditionalontruthofstatements"> | |
| <p> | |
| Format: | |
| </p> | |
| <p> | |
| <strong>#</strong> [ <strong>{</strong> ] <strong>if</strong> [ <strong>}</strong> ] <strong>(</strong> [condition] <strong>)</strong> [output] [ | |
| <strong>#</strong> [ <strong>{</strong> ] <strong>elseif</strong> [ <strong>}</strong> ] <strong>( </strong>[condition] <strong>)</strong> [output] ]* [ | |
| <strong>#</strong> [ <strong>{</strong> ] <strong>else</strong> [ <strong>}</strong> ] [output] ] | |
| <strong>#</strong> [ <strong>{</strong> ] <strong>end</strong> [ <strong>}</strong> ] | |
| </p> | |
| <p> | |
| Usage: | |
| </p> | |
| <ul> | |
| <li><em>condition</em> - If a boolean, considered true if it has a | |
| true false; if not a boolean, considered true if not null.</li> | |
| <li><em>output</em> - May contain VTL.</li> | |
| </ul> | |
| <p> | |
| Examples (showing different operators): | |
| </p> | |
| <table> | |
| <tr> | |
| <th>Operator Name</th> | |
| <th>Symbol</th> | |
| <th>Alternative Symbol</th> | |
| <th>Example</th> | |
| </tr> | |
| <tr> | |
| <td>Equals Number</td> | |
| <td>==</td> | |
| <td>eq</td> | |
| <td> #if( $foo == 42 )</td> | |
| </tr> | |
| <tr> | |
| <td>Equals String</td> | |
| <td>==</td> | |
| <td>eq</td> | |
| <td> #if( $foo == "bar" )</td> | |
| </tr> | |
| <tr> | |
| <td>Object Equivalence</td> | |
| <td>==</td> | |
| <td>eq</td> | |
| <td> #if( $foo == $bar )</td> | |
| </tr> | |
| <tr> | |
| <td>Not Equals</td> | |
| <td>!=</td> | |
| <td>ne</td> | |
| <td> #if( $foo != $bar )</td> | |
| </tr> | |
| <tr> | |
| <td>Greater Than</td> | |
| <td>></td> | |
| <td>gt</td> | |
| <td> #if( $foo > 42 )</td> | |
| </tr> | |
| <tr> | |
| <td>Less Than</td> | |
| <td><</td> | |
| <td>lt</td> | |
| <td> #if( $foo < 42 )</td> | |
| </tr> | |
| <tr> | |
| <td>Greater Than or Equal To</td> | |
| <td>>=</td> | |
| <td>ge</td> | |
| <td> #if( $foo >= 42 )</td> | |
| </tr> | |
| <tr> | |
| <td>Less Than or Equal To</td> | |
| <td><=</td> | |
| <td>le</td> | |
| <td> #if( $foo <= 42 )</td> | |
| </tr> | |
| <tr> | |
| <td>Boolean NOT</td> | |
| <td>!</td> | |
| <td>not</td> | |
| <td> #if( !$foo )</td> | |
| </tr> | |
| </table> | |
| <p>Notes:</p> | |
| <ol> | |
| <li> | |
| The == operator can be used to compare numbers, strings, objects of the same class, or objects | |
| of different classes. In the last case (when objects are of different classes), the toString() | |
| method is called on each object and the resulting Strings are compared. | |
| </li> | |
| <li> | |
| You can also use brackets to delimit directives. This is especially | |
| useful when text immediately follows an <code>#else</code> directive. | |
| </li> | |
| </ol> | |
| <source><![CDATA[ | |
| #if( $foo == $bar)it's true!#{else}it's not!#end</li> | |
| ]]></source> | |
| </subsection> | |
| <subsection name="#foreach - Loops through a list of objects" href="foreach-Loopsthroughalistofobjects"> | |
| <p> | |
| Format: | |
| </p> | |
| <p> | |
| <strong>#</strong> [ <strong>{</strong> ] <strong>foreach</strong> [ <strong>}</strong> ] <strong>(</strong> <em>$ref</em> <strong>in</strong> <em>arg</em> | |
| <strong>)</strong> <em>statement</em> | |
| <strong>#</strong> [ <strong>{</strong> ] <strong>end</strong> [ <strong>}</strong> ] | |
| </p> | |
| <p> | |
| Usage: | |
| </p> | |
| <ul> | |
| <li><em>$ref</em> - The first variable reference is the item.</li> | |
| <li><em>arg</em> - May be one of the following: a reference to a | |
| list (i.e. object array, collection, or map), an array list, or | |
| the range operator.</li> | |
| <li> | |
| <em>statement</em> - What is output each time Velocity finds a | |
| valid item in the list denoted above as <i>arg</i>. This output is | |
| any valid VTL and is rendered each iteration of the loop. | |
| </li> | |
| </ul> | |
| <p> | |
| Examples of the #foreach(), omitting the statement block : | |
| </p> | |
| <ul> | |
| <li>Reference: #foreach ( $item in $items )</li> | |
| <li>Array list: #foreach ( $item in ["Not", $my, "fault"] )</li> | |
| <li>Range operator: #foreach ( $item in [1..3] )</li> | |
| </ul> | |
| <p> | |
| Velocity provides an easy way to get the loop counter so that you | |
| can do something like the following: | |
| </p> | |
| <source><![CDATA[ | |
| <table> | |
| #foreach( $customer in $customerList ) | |
| <tr><td>$velocityCount</td><td>$customer.Name</td></tr> | |
| #end | |
| </table> | |
| ]]></source> | |
| <p> | |
| The default name for the loop counter variable reference, which is | |
| specified in the velocity.properties file, is $velocityCount. By | |
| default the counter starts at 1, but this can be set to either 0 or | |
| 1 in the <code>velocity.properties</code> file. Here's what the loop | |
| counter properties section of the <code>velocity.properties</code> | |
| file appears: | |
| </p> | |
| <source><![CDATA[ | |
| # Default name of the loop counter | |
| # variable reference. | |
| directive.foreach.counter.name = velocityCount | |
| # Default starting value of the loop | |
| # counter variable reference. | |
| directive.foreach.counter.initial.value = 1 | |
| ]]></source> | |
| <p> | |
| Additionally, the maximum allowed number of loop iterations can be | |
| controlled engine-wide (an ability introduced in Velocity 1.5). | |
| By default, there is no limit: | |
| </p> | |
| <source><![CDATA[ | |
| # The maximum allowed number of loops. | |
| directive.foreach.maxloops = -1 | |
| ]]></source> | |
| </subsection> | |
| <subsection name="#include - Renders local file(s) that are not parsed by Velocity" href="include-Renderslocalfile(s)thatarenotparsedbyVelocity"> | |
| <p> | |
| Format: | |
| </p> | |
| <p> | |
| <strong>#</strong> [ <strong>{</strong> ] <strong>include</strong> [ <strong>}</strong> ] <strong>( </strong>arg[ arg2 ... argn]<strong> )</strong> | |
| </p> | |
| <ul> | |
| <li><em>arg</em> - Refers to a valid file under TEMPLATE_ROOT.</li> | |
| </ul> | |
| <p> | |
| Examples: | |
| </p> | |
| <ul> | |
| <li>String: #include( "disclaimer.txt" "opinion.txt" )</li> | |
| <li>Variable: #include( $foo $bar )</li> | |
| </ul> | |
| </subsection> | |
| <subsection name="#parse - Renders a local template that is parsed by Velocity" href="parse-RendersalocaltemplatethatisparsedbyVelocity"> | |
| <p> | |
| Format: | |
| </p> | |
| <p> | |
| <strong>#</strong> [ <strong>{</strong> ] <strong>parse</strong> [ <strong>}</strong> ] <strong>(</strong> arg <strong>)</strong> | |
| </p> | |
| <ul> | |
| <li><em>arg</em> - Refers to a template under TEMPLATE_ROOT.</li> | |
| </ul> | |
| <p> | |
| Examples: | |
| </p> | |
| <ul> | |
| <li>String: #parse( "lecorbusier.vm" )</li> | |
| <li>Variable: #parse( $foo )</li> | |
| </ul> | |
| <p> | |
| Recursion permitted. See <em>parse_directive.maxdepth</em> in | |
| <code>velocity.properties</code> | |
| to change from parse depth. (The default parse depth is 10.) | |
| </p> | |
| </subsection> | |
| <subsection name="#stop - Stops the template engine" href="stop-Stopsthetemplateengine"> | |
| <p> | |
| Format: | |
| </p> | |
| <p> | |
| <strong>#</strong> [ <strong>{</strong> ] <strong>stop</strong> [ <strong>}</strong> ] | |
| </p> | |
| <p> | |
| Usage: | |
| </p> | |
| <p> | |
| This will stop execution of the current template. This is good for | |
| debugging a template. | |
| </p> | |
| </subsection> | |
| <subsection name="#macro - Allows users to define a Velocimacro (VM), a repeated segment of a VTL template, as required" href="macro-AllowsuserstodefineaVelocimacro(VM),arepeatedsegmentofaVTLtemplate,asrequired"> | |
| <p> | |
| Format: | |
| </p> | |
| <p> | |
| <strong>#</strong> [ <strong>{</strong> ] <strong>macro</strong> [ <strong>}</strong> ] <strong>(</strong> vmname $arg1 [ $arg2 $arg3 ... $argn ] | |
| <strong>)</strong> [ VM VTL code... ] <strong>#</strong> [ <strong>{</strong> ] <strong>#end</strong> [ <strong>}</strong> ] | |
| </p> | |
| <ul> | |
| <li><em>vmname</em> - Name used to call the VM | |
| (<em>#vmname</em>)</li> | |
| <li><em>$arg1 $arg2 [ ... ]</em> - Arguments to the VM. There can be | |
| any number of arguments, but the number used at invocation must | |
| match the number specified in the definition.</li> | |
| <li><em>[ VM VTL code... ]</em> - Any valid VTL code, anything you | |
| can put into a template, can be put into a VM.</li> | |
| </ul> | |
| <p> | |
| Once defined, the VM is used like any other VTL directive in a | |
| template. | |
| </p> | |
| <source><![CDATA[ | |
| #vmname( $arg1 $arg2 ) | |
| ]]></source> | |
| <p> | |
| VMs can be defined in one of two places: | |
| </p> | |
| <ol> | |
| <li><i>Template library:</i> can be either VMs pre-packaged with | |
| Velocity or custom-made, user-defined, site-specific VMs; | |
| available from any template</li> | |
| <li><i>Inline:</i> found in regular templates, only usable when | |
| <em>velocimacro.permissions.allowInline=true</em> in | |
| <code>velocity.properties</code>.</li> | |
| </ol> | |
| </subsection> | |
| </section> | |
| <section name="Comments" href="Comments"> | |
| <p> | |
| Comments are not rendered at runtime. | |
| </p> | |
| <subsection name="Single Line" href="SingleLine"> | |
| <p> | |
| Example: | |
| </p> | |
| <p> | |
| <strong>## This is a comment.</strong> | |
| </p> | |
| </subsection> | |
| <subsection name="Multi Line" href="MultiLine"> | |
| <p> | |
| Example: | |
| </p> | |
| <p> | |
| <strong> | |
| #*<br/> | |
| This is a multiline comment.<br/> | |
| This is the second line<br/> | |
| *# | |
| </strong> | |
| </p> | |
| </subsection> | |
| </section> | |
| </body> | |
| </document> | |