velocity语法大全

来源:互联网 发布:小小食杂铺 知乎 编辑:程序博客网 时间:2024/06/05 02:17

Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。

<code style="padding:0px; font-family:Menlo,Monaco,'Courier New',monospace; font-size:14px; color:inherit; background-color:transparent; border:0px"><span class="com" style="color:#87ceeb;">#set($maxValue=5)</span><span class="pln" style="color:#ffffff;"></span><span class="com" style="color:#87ceeb;">#set($name="Bob")</span><span class="pln" style="color:#ffffff;"></span><span class="com" style="color:#87ceeb;">#set($arrayName=["element1","element2",...])</span></code>
<code style="padding:0px; font-family:Menlo,Monaco,'Courier New',monospace; font-size:14px; color:inherit; background-color:transparent; border:0px"><span class="com" style="color:#87ceeb;">## This is a single line comment.</span><span class="pln" style="color:#ffffff;"></span><span class="com" style="color:#87ceeb;">#*</span><span class="pln" style="color:#ffffff;"></span><span class="typ" style="color:#98fb98;">Thus</span><span class="pln" style="color:#ffffff;"> begins a multi</span><span class="pun" style="color:#ffffff;">-</span><span class="pln" style="color:#ffffff;">line comment</span><span class="pun" style="color:#ffffff;">.</span><span class="pln" style="color:#ffffff;"> </span><span class="typ" style="color:#98fb98;">Online</span><span class="pln" style="color:#ffffff;"> visitors won</span><span class="str" style="color:#ffa0a0;">'tsee this text because the Velocity Templating Engine willignore it.*#</span></code>

Velocity 遇到一个不能处理的引用时,一般他会直接输出这个引用$email 的写法,页面上会看到的是$email,如下例,我们可以在$后面加上一个!号,那么就会输出空白:

<code style="padding:0px; font-family:Menlo,Monaco,'Courier New',monospace; font-size:14px; color:inherit; background-color:transparent; border:0px"><span class="tag" style="color:#f0e68c;font-weight:bold"><input</span><span class="pln" style="color:#ffffff;"> </span><span class="atn" style="color:#bdb76b;font-weight:bold">type</span><span class="pun" style="color:#ffffff;">=</span><span class="atv" style="color:#ffa0a0;">"text"</span><span class="pln" style="color:#ffffff;"> </span><span class="atn" style="color:#bdb76b;font-weight:bold">name</span><span class="pun" style="color:#ffffff;">=</span><span class="atv" style="color:#ffa0a0;">"email"</span><span class="pln" style="color:#ffffff;"> </span><span class="atn" style="color:#bdb76b;font-weight:bold">value</span><span class="pun" style="color:#ffffff;">=</span><span class="atv" style="color:#ffa0a0;">"$email"</span><span class="tag" style="color:#f0e68c;font-weight:bold">/></span><span class="pln" style="color:#ffffff;"></span><span class="tag" style="color:#f0e68c;font-weight:bold"><input</span><span class="pln" style="color:#ffffff;"> </span><span class="atn" style="color:#bdb76b;font-weight:bold">type</span><span class="pun" style="color:#ffffff;">=</span><span class="atv" style="color:#ffa0a0;">"text"</span><span class="pln" style="color:#ffffff;"> </span><span class="atn" style="color:#bdb76b;font-weight:bold">name</span><span class="pun" style="color:#ffffff;">=</span><span class="atv" style="color:#ffa0a0;">"email"</span><span class="pln" style="color:#ffffff;"> </span><span class="atn" style="color:#bdb76b;font-weight:bold">value</span><span class="pun" style="color:#ffffff;">=</span><span class="atv" style="color:#ffa0a0;">"$!email"</span><span class="tag" style="color:#f0e68c;font-weight:bold">/></span></code>

如果email 己定义了(比如它的值是foo),而这里你却想输出$email. 这样一个字符串,就需要使用转义字符”\”.

<code style="padding:0px; font-family:Menlo,Monaco,'Courier New',monospace; font-size:14px; color:inherit; background-color:transparent; border:0px"><span class="com" style="color:#87ceeb;">## The following line defines $email in this template:</span><span class="pln" style="color:#ffffff;"></span><span class="com" style="color:#87ceeb;">#set( $email = "foo" )</span><span class="pln" style="color:#ffffff;">$email\$email\\$email\\\$email</span></code>

上面的模板在web 页面上的输出将是:

<code style="padding:0px; font-family:Menlo,Monaco,'Courier New',monospace; font-size:14px; color:inherit; background-color:transparent; border:0px"><span class="pln" style="color:#ffffff;">foo$email\foo\$email</span></code>

但注意:如果右边的操作数是一个属性或命令的引用而返回null,那么赋值将不会成功,且在随后也不能再取出使用. 如下例:

<code style="padding:0px; font-family:Menlo,Monaco,'Courier New',monospace; font-size:14px; color:inherit; background-color:transparent; border:0px"><span class="com" style="color:#87ceeb;">#set( $result = $query.criteria("name"))</span><span class="pln" style="color:#ffffff;"></span><span class="typ" style="color:#98fb98;">The</span><span class="pln" style="color:#ffffff;"> result of the first query </span><span class="kwd" style="color:#f0e68c;font-weight:bold">is</span><span class="pln" style="color:#ffffff;"> $result</span><span class="com" style="color:#87ceeb;">#set( $result = $query.criteria("address"))</span><span class="pln" style="color:#ffffff;"></span><span class="typ" style="color:#98fb98;">The</span><span class="pln" style="color:#ffffff;"> result of the second query </span><span class="kwd" style="color:#f0e68c;font-weight:bold">is</span><span class="pln" style="color:#ffffff;"> $result</span></code>

如果$query.criteria("name") 返回的是字符串"bill", 但$query.criteria("address") 返回null,上面的输出结果将是:

<code style="padding:0px; font-family:Menlo,Monaco,'Courier New',monospace; font-size:14px; color:inherit; background-color:transparent; border:0px"><span class="typ" style="color:#98fb98;">The</span><span class="pln" style="color:#ffffff;"> result of the first query </span><span class="kwd" style="color:#f0e68c;font-weight:bold">is</span><span class="pln" style="color:#ffffff;"> bill</span><span class="typ" style="color:#98fb98;">The</span><span class="pln" style="color:#ffffff;"> result of the second query </span><span class="kwd" style="color:#f0e68c;font-weight:bold">is</span><span class="pln" style="color:#ffffff;"> bill</span></code>

又如下例:

<code style="padding:0px; font-family:Menlo,Monaco,'Courier New',monospace; font-size:14px; color:inherit; background-color:transparent; border:0px"><span class="com" style="color:#87ceeb;">#set( $criteria = ["name", "address"] )</span><span class="pln" style="color:#ffffff;"></span><span class="com" style="color:#87ceeb;">#foreach($criterion in $criteria )</span><span class="pln" style="color:#ffffff;">    </span><span class="com" style="color:#87ceeb;">#set($result=$query.criteria($criterion) )</span><span class="pln" style="color:#ffffff;">    </span><span class="com" style="color:#87ceeb;">#if($result)</span><span class="pln" style="color:#ffffff;">        </span><span class="typ" style="color:#98fb98;">Query</span><span class="pln" style="color:#ffffff;"> was successful</span><span class="com" style="color:#87ceeb;">#end</span></code>

在上例中,就不能依赖if($result)来决定查询是否成功. #set右边如果是null会 它将不能被赋其它值.一个解决办法是,每次都将$result设为false:

<code style="padding:0px; font-family:Menlo,Monaco,'Courier New',monospace; font-size:14px; color:inherit; background-color:transparent; border:0px"><span class="com" style="color:#87ceeb;">#set( $criteria = ["name", "address"] )</span><span class="pln" style="color:#ffffff;"></span><span class="com" style="color:#87ceeb;">#foreach($criterion in $criteria )</span><span class="pln" style="color:#ffffff;">    </span><span class="com" style="color:#87ceeb;">#set($result = false)</span><span class="pln" style="color:#ffffff;">    </span><span class="com" style="color:#87ceeb;">#set($result=$query.criteria($criterion) )</span><span class="pln" style="color:#ffffff;">    </span><span class="com" style="color:#87ceeb;">#if($result)</span><span class="pln" style="color:#ffffff;">        </span><span class="typ" style="color:#98fb98;">Query</span><span class="pln" style="color:#ffffff;"> was successful</span><span class="com" style="color:#87ceeb;">#end</span></code>
<code style="padding:0px; font-family:Menlo,Monaco,'Courier New',monospace; font-size:14px; color:inherit; background-color:transparent; border:0px"><span class="com" style="color:#87ceeb;">#if($foo<10)</span><span class="pln" style="color:#ffffff;">    </span><span class="str" style="color:#ffa0a0;"><strong></span><span class="typ" style="color:#98fb98;">Go</span><span class="pln" style="color:#ffffff;"> </span><span class="typ" style="color:#98fb98;">North</span><span class="pun" style="color:#ffffff;"></</span><span class="pln" style="color:#ffffff;">strong</span><span class="pun" style="color:#ffffff;">></span><span class="pln" style="color:#ffffff;"></span><span class="com" style="color:#87ceeb;">#elseif($foo==10)</span><span class="pln" style="color:#ffffff;">    </span><span class="str" style="color:#ffa0a0;"><strong></span><span class="typ" style="color:#98fb98;">Go</span><span class="pln" style="color:#ffffff;"> </span><span class="typ" style="color:#98fb98;">East</span><span class="pun" style="color:#ffffff;"></</span><span class="pln" style="color:#ffffff;">strong</span><span class="pun" style="color:#ffffff;">></span><span class="pln" style="color:#ffffff;"></span><span class="com" style="color:#87ceeb;">#elseif($bar==6)</span><span class="pln" style="color:#ffffff;">    </span><span class="str" style="color:#ffa0a0;"><strong></span><span class="typ" style="color:#98fb98;">Go</span><span class="pln" style="color:#ffffff;"> </span><span class="typ" style="color:#98fb98;">South</span><span class="pun" style="color:#ffffff;"></</span><span class="pln" style="color:#ffffff;">strong</span><span class="pun" style="color:#ffffff;">></span><span class="pln" style="color:#ffffff;"></span><span class="com" style="color:#87ceeb;">#else</span><span class="pln" style="color:#ffffff;">    </span><span class="str" style="color:#ffa0a0;"><strong></span><span class="typ" style="color:#98fb98;">Go</span><span class="pln" style="color:#ffffff;"> </span><span class="typ" style="color:#98fb98;">West</span><span class="pun" style="color:#ffffff;"></</span><span class="pln" style="color:#ffffff;">strong</span><span class="pun" style="color:#ffffff;">></span><span class="pln" style="color:#ffffff;"></span><span class="com" style="color:#87ceeb;">#end</span></code>

通过引用变量$velocityCount 可以访问到Velocity 提供的计数器:

<code style="padding:0px; font-family:Menlo,Monaco,'Courier New',monospace; font-size:14px; color:inherit; background-color:transparent; border:0px"><span class="tag" style="color:#f0e68c;font-weight:bold"><table></span><span class="pln" style="color:#ffffff;">#foreach( $customer in $customerList )    </span><span class="tag" style="color:#f0e68c;font-weight:bold"><tr><td></span><span class="pln" style="color:#ffffff;">$velocityCount</span><span class="tag" style="color:#f0e68c;font-weight:bold"></td><td></span><span class="pln" style="color:#ffffff;">$customer.Name</span><span class="tag" style="color:#f0e68c;font-weight:bold"></td></tr></span><span class="pln" style="color:#ffffff;">#end</span><span class="tag" style="color:#f0e68c;font-weight:bold"></table></span></code>

$velocityCount是默认的计数器引用,你可以在配置velocity.properties 中改成你喜欢的:

include脚本元素让模板设计者可以在模板中引入一个本地文件, 这个被引入的文件将不会经过Velocity 的解析. 安全起见,可以引放的文件只是是配置参数TEMPLATE_ROOT所定义目录下的,默认为当前目录下.

<code style="padding:0px; font-family:Menlo,Monaco,'Courier New',monospace; font-size:14px; color:inherit; background-color:transparent; border:0px"><span class="com" style="color:#87ceeb;">#include</span><span class="pun" style="color:#ffffff;">(</span><span class="pln" style="color:#ffffff;"> </span><span class="str" style="color:#ffa0a0;">"one.txt"</span><span class="pln" style="color:#ffffff;"> </span><span class="pun" style="color:#ffffff;">)</span></code>

多个文件或者用变量名代替:

<code style="padding:0px; font-family:Menlo,Monaco,'Courier New',monospace; font-size:14px; color:inherit; background-color:transparent; border:0px"><span class="com" style="color:#87ceeb;">#include</span><span class="pun" style="color:#ffffff;">(</span><span class="pln" style="color:#ffffff;"> </span><span class="str" style="color:#ffa0a0;">"greetings.txt"</span><span class="pun" style="color:#ffffff;">,</span><span class="pln" style="color:#ffffff;"> $seasonalstock </span><span class="pun" style="color:#ffffff;">)</span></code>

parse元素指示可以引入一个包含TVL 的本地文件,这个文件将被Veloict engine 解析输出。

<code style="padding:0px; font-family:Menlo,Monaco,'Courier New',monospace; font-size:14px; color:inherit; background-color:transparent; border:0px"><span class="com" style="color:#87ceeb;">#parse( "me.vm" )</span></code>

与#include 指令不同, #parse 可以从引入的模板中得到变量引用.但#parse 指令只能接受一个参数.

VTL templates 被#parse 的模板中还可以再包含#parse 声明,默认的深度为10,这是由配置参数directive.parse.max.depth 在文件velocity.properties 中决定的,你可以修改它以适合项目要求

stop指令用来指示在模板的某处,engine 停止解析,这一般用来调用。用法很简单.

<code style="padding:0px; font-family:Menlo,Monaco,'Courier New',monospace; font-size:14px; color:inherit; background-color:transparent; border:0px"><span class="com" style="color:#87ceeb;">#stop</span></code>

macro指令让模板设计者可以将些重复、相关的的脚本版断定义为一个功能块.

<code style="padding:0px; font-family:Menlo,Monaco,'Courier New',monospace; font-size:14px; color:inherit; background-color:transparent; border:0px"><span class="com" style="color:#87ceeb;">#macro( tablerows $color $somelist )</span><span class="pln" style="color:#ffffff;"></span><span class="com" style="color:#87ceeb;">#foreach( $something in $somelist )</span><span class="pln" style="color:#ffffff;">    </span><span class="str" style="color:#ffa0a0;"><tr></span><span class="pun" style="color:#ffffff;"><</span><span class="pln" style="color:#ffffff;">td bgcolor</span><span class="pun" style="color:#ffffff;">=</span><span class="pln" style="color:#ffffff;">$color</span><span class="pun" style="color:#ffffff;">></span><span class="pln" style="color:#ffffff;">$something</span><span class="pun" style="color:#ffffff;"><</span><span class="str" style="color:#ffa0a0;">/td></</span><span class="pln" style="color:#ffffff;">tr</span><span class="pun" style="color:#ffffff;">></span><span class="pln" style="color:#ffffff;"></span><span class="com" style="color:#87ceeb;">#end</span><span class="pln" style="color:#ffffff;"></span><span class="com" style="color:#87ceeb;">#end</span></code>

然后,我们在页面中来使用:

<code style="padding:0px; font-family:Menlo,Monaco,'Courier New',monospace; font-size:14px; color:inherit; background-color:transparent; border:0px"><span class="com" style="color:#87ceeb;">#set( $greatlakes = ["Superior","Michigan","Huron","Erie","Ontario"] )</span><span class="pln" style="color:#ffffff;"></span><span class="com" style="color:#87ceeb;">#set( $color = "blue" )</span><span class="pln" style="color:#ffffff;"></span><span class="str" style="color:#ffa0a0;"><table></span><span class="pln" style="color:#ffffff;">    </span><span class="com" style="color:#87ceeb;">#tablerows( $color $greatlakes )</span><span class="pln" style="color:#ffffff;"></span><span class="pun" style="color:#ffffff;"></</span><span class="pln" style="color:#ffffff;">table</span><span class="pun" style="color:#ffffff;">></span></code>

输出结果:

<code style="padding:0px; font-family:Menlo,Monaco,'Courier New',monospace; font-size:14px; color:inherit; background-color:transparent; border:0px"><span class="tag" style="color:#f0e68c;font-weight:bold"><table></span><span class="pln" style="color:#ffffff;">    </span><span class="tag" style="color:#f0e68c;font-weight:bold"><tr><td</span><span class="pln" style="color:#ffffff;"> </span><span class="atn" style="color:#bdb76b;font-weight:bold">bgcolor</span><span class="pun" style="color:#ffffff;">=</span><span class="atv" style="color:#ffa0a0;">"blue"</span><span class="tag" style="color:#f0e68c;font-weight:bold">></span><span class="pln" style="color:#ffffff;">Superior</span><span class="tag" style="color:#f0e68c;font-weight:bold"></td></tr></span><span class="pln" style="color:#ffffff;">    </span><span class="tag" style="color:#f0e68c;font-weight:bold"><tr><td</span><span class="pln" style="color:#ffffff;"> </span><span class="atn" style="color:#bdb76b;font-weight:bold">bgcolor</span><span class="pun" style="color:#ffffff;">=</span><span class="atv" style="color:#ffa0a0;">"blue"</span><span class="tag" style="color:#f0e68c;font-weight:bold">></span><span class="pln" style="color:#ffffff;">Michigan</span><span class="tag" style="color:#f0e68c;font-weight:bold"></td></tr></span><span class="pln" style="color:#ffffff;">    </span><span class="tag" style="color:#f0e68c;font-weight:bold"><tr><td</span><span class="pln" style="color:#ffffff;"> </span><span class="atn" style="color:#bdb76b;font-weight:bold">bgcolor</span><span class="pun" style="color:#ffffff;">=</span><span class="atv" style="color:#ffa0a0;">"blue"</span><span class="tag" style="color:#f0e68c;font-weight:bold">></span><span class="pln" style="color:#ffffff;">Huron</span><span class="tag" style="color:#f0e68c;font-weight:bold"></td></tr></span><span class="pln" style="color:#ffffff;">    </span><span class="tag" style="color:#f0e68c;font-weight:bold"><tr><td</span><span class="pln" style="color:#ffffff;"> </span><span class="atn" style="color:#bdb76b;font-weight:bold">bgcolor</span><span class="pun" style="color:#ffffff;">=</span><span class="atv" style="color:#ffa0a0;">"blue"</span><span class="tag" style="color:#f0e68c;font-weight:bold">></span><span class="pln" style="color:#ffffff;">Erie</span><span class="tag" style="color:#f0e68c;font-weight:bold"></td></tr></span><span class="pln" style="color:#ffffff;">    </span><span class="tag" style="color:#f0e68c;font-weight:bold"><tr><td</span><span class="pln" style="color:#ffffff;"> </span><span class="atn" style="color:#bdb76b;font-weight:bold">bgcolor</span><span class="pun" style="color:#ffffff;">=</span><span class="atv" style="color:#ffa0a0;">"blue"</span><span class="tag" style="color:#f0e68c;font-weight:bold">></span><span class="pln" style="color:#ffffff;">Ontario</span><span class="tag" style="color:#f0e68c;font-weight:bold"></td></tr></span><span class="pln" style="color:#ffffff;"></span><span class="tag" style="color:#f0e68c;font-weight:bold"></table></span></code>

如果将宏#tablerows($color $list) 定义到一个模板库中(Velocimacros template library), 其它模板就都可以访问它了.

尽量不要直接在模板中使用#parse() 包含#macro() 指令.因为#parse() 动作在运行时执行,时会有一个在VM 中查找元素的过程.

0 0
原创粉丝点击