发布于 2016-05-16 15:30:35 | 433 次阅读 | 评论: 0 | 来源: PHPERZ
Velocity 1.6引入严格引用模式的概率,通过设置Velocity配置属性“runtime.references.strict”为true激活。在未定义或歧义的情况下,Velocity将抛出异常。使用该设置引用必须明确放置在context中或使用#set指令定义或抛异常。引用在context中有一个null值将不会产生一个异常。此外,如果试图调用不存在的方法或属性将抛出异常。如果试图调用的对象是null抛出异常。
在下面的例子中,$bar已定义,$foo未定义,所有这些语句将抛出异常:
$foo ## Exception
#set($bar = $foo) ## Exception
#if($foo == $bar)#end ## Exception
#foreach($item in $foo)#end ## Exception
当试图调用的方法或属性不存在时Velocity抛出异常。在这种情况下,$bar包含一个对象定义一个属性"foo"返回一个字符串,而retnull防御null。
$bar.bogus ## $bar没有bogus属性,Exception
$bar.foo.bogus ## $bar.foo没有bogus属性,Exception
$bar.retnull.bogus ## 不能在null上调用属性,Exception
#if和#elseif指令中的引用比较特殊:
#if ($foo)#end ## False
#if ( ! $foo)#end ## True
#if ($foo && $foo.bar)#end ## False并且$foo.bar将不会计算
#if ($foo && $foo == "bar")#end ## False并且$foo == "bar"将不会计算
#if ($foo1 || $foo2)#end ## False $foo1并且$foo2将不会计算
严格模式必须在#if指令中包含>、<、>=或<=。同时,参数#foreach必须迭代(该行为能修改属性 directive.foreach.skip.invalid)。最后,在严格模式下,未定义宏引用也将抛出异常。
this is $foo ## 抛出异常,因为$foo是null
this is $!foo ## 渲染为"this is "没有异常
this is $!bogus ## bogus不在context中,因此抛出异常