分享
 
 
 

Velocity的中文指南(5)-整理

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

1. VTL: 格式化

虽然在本指南中的VTL经常显示在新行中或者有空格,但是下面的VTL

#set( $imperial = ["Munetaka","Koreyasu","Hisakira","Morikune"] )

#foreach( $shogun in $imperial )

$shogun

#end

和下面的写法同样有效。

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.

上面每种写法结果都一样。

2. 其它特征和杂项

2.1. 数学特征

Velocity 有一些内建的数学功能,可以使用set指令用在模版中。下面的共识分别演示了加减乘除运算:

#set( $foo = $bar + 3 )

#set( $foo = $bar - 4 )

#set( $foo = $bar * 6 )

#set( $foo = $bar / 2 )

当进行除法运算时,结果将会是整数。When a division operation is performed, the result will be an integer. 余数则可以通过模(%)运算获得。

#set( $foo = $bar % 5 )

在Velocity 中,只有整数可以进行数学运算;如果执行非整数的数学运算,将被记录下来,并返回null 。

2.2. 范围操作符

范围操作符可以和#set 和#foreach 语句一起使用。有助于产生一个整数的目标数组,范围操作符有以下的结构:

[n..m]

n 和 m 都必须是整数或者可以产生整数。不管 m 大于或者小于n 都没关系;在m小于n这种情况下,范围可以向下计数。下面是使用范围操作符的例子:

第一个例子

#foreach( $foo in [1..5] )

$foo

#end

第二个例子

#foreach( $bar in [2..-2] )

$bar

#end

第三个例子

#set( $arr = [0..1] )

#foreach( $i in $arr )

$i

#end

第四个例子

[1..3]

他们分别产生一下输出

1 2 3 4 5

2 1 0 -1 -2

0 1

[1..3]

范围操作符和#set 和#foreach 指令一起使用时,只是产生数组。

页面设计人员在设计具有相同尺寸的表格时,有时没有足够的数据来填充,他们会发现范围操作符非常有用。

2.3. 进阶:转义和!

当一个引用被! 字符处于静寂模式,并且! 字符在转义符\ 前出现,应用将用一种特别的方式处理。请注意他和常规转义的不同,下面这种情况\ 先于! 出现:

#set( $foo = "bar" )

$\!foo

$\!{foo}

$\\!foo

$\\\!foo

这样将被加工成

$!foo

$!{foo}

$\!foo

$\\!foo

对比常规转义,\先于 $:

\$foo

\$!foo

\$!{foo}

\\$!{foo}

这是结果是:

\$foo

\$!foo

\$!{foo}

\bar

3. Velocimacro 杂记

本节是关于Velocimacros的一个小型FAQ。 本届内容会不时更新,所以请常来检查新的内容,

注 : 本节中, 'Velocimacro' 将简写为'VM'。

Q:是否可以使用指令directive 或者 VM 作为另一个VM的参数? 例如: #center( #bold("hello") )

A: 不行。指令不能用作指令的参数,而大多数情况下,作为实际的应用,VM就是指令。

不过也有一些办法。一个简单的做法是使用双引号来加工你的内容。所以,你可以这样:

#set($stuff = "#bold('hello')" )

#center( $stuff )

甚至可以节省一个步骤:

#center( "#bold( 'hello' )" )

请注意,后面这个例子中,参数是在VM内部被求值,不是在调用的那一层次上。换句话说,被传入的VM的参数是整个被传入的,并且在传入的VM内部被求值。所以我们可以这样做:

#macro( inner $foo )

inner : $foo

#end

#macro( outer $foo )

#set($bar = "outerlala")

outer : $foo

#end

#set($bar = 'calltimelala')

#outer( "#inner($bar)" )

这里,输入将会是:

Outer : inner : outerlala

因为"#inner($bar)" 的求值发生在#outer()内部,所以在#outer() 内设置的$bar得值会是其使用的值。

这是一个有意的保护特征—参数按名称传递给VM,所以可以将象状态引用的东西传给VM ,比如:

#macro( foo $color )

<tr bgcolor=$color><td>Hi</td></tr>

<tr bgcolor=$color><td>There</td></tr>

#end

#foo( $bar.rowColor() )

rowColor() 被重复调用而不是一次。为避免如此,可以调用VM外部的方法,然后将值传递给VM.

#set($color = $bar.rowColor())

#foo( $color )

Q:是否可以通过#parse()注册VM ?

A:当前, Velocimacros 在其首次在模版中使用前必须首先定义它。这意味着, #macro() 宣称应该在使用Velocimacros之前。

如果你想#parse() 一个包含#macro() 指令的模板,记住这个非常重要。因为#parse() 在运行时发生,解析器在解析时要决定是否模版中一个看起来像VM的元素真是VM,所以解析一系列VM 宣称可能并不能如愿地工作的很好。为避免如此,可以简单地使用velocimacro.library 的办法,使Velocity 在启动时载入VM。

Q. 什么是VM自动载入(Velocimacro Autoreloading)?

A. 这是一个属性,在开发时使用,而不时运行时:

velocimacro.library.autoreload

默认值为false。当设置为true时,连同<type>.resource.loader.cache 属性设置为false(这里<type> 是使用的资源载入器的名称,比如'file') ,Velocity 引擎在你创建VM库文件是将自动载入其改变,这样你就不必将其导入servlet 引擎(或者应用程序)中,或者用其他手段来使其自动重新载入。

下面是一个简单的设置配置组合:

file.resource.loader.path = templates

file.resource.loader.cache = false

velocimacro.library.autoreload = true

注意在生产状态(运行时)不要使其打开。

4. 字符串联

开发者常问的一个问题是“我如何进行字符串串联?”是否有类似于JAVA中的'+'操作符?

为了串联VTL中的引用,你不得不将它们“放在一起”。而你想要放置在一起的上下文很重要,下面举例说明。

在常规“笨办法”模板中:

#set( $size = "Big" )

#set( $name = "Ben" )

The clock is $size$name.

输出将会是:'The clock is BigBen’。我们来看更有趣的事情,比如,当你想串联一个字符串并传递给一个方法,或者设置一个新的引用,可以这样:

#set( $size = "Big" )

#set( $name = "Ben" )

#set($clock = "$size$name" )

The clock is $clock.

结果是一样的。作为最后一个例子,当你想混合“静态”字符串到引用中,你可能需要使用“形式引用”:

#set( $size = "Big" )

#set( $name = "Ben" )

#set($clock = "${size}Tall$name" )

现在,输出将会是'The clock is BigTallBen'。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有