在使用Velocity模板引擎作为Web应用页面渲染引擎,经常会遇到由于Velocity语法不够强大,导致莫名其妙问题。
比如在#foreach无法break。特别隐藏的问题是#foreach中使用#set无法清空临时set对象。
<span style="font-family:Microsoft YaHei;font-size:12px;">#foreach($item in $!itemList)
#set($xp = $!itemPriceMap.get($!{item.id}))
// ...
#end</span>
如上代码中,如果itemPriceMap中不包含循环中的item,$xp在循环中还会保持上次循环的值。
所以一个引用被创建后,一般无法移除。
解决方案:
If the RHS is a property or method reference that evaluates to null,
it will not be assigned to the LHS. Depending on how Velocity is configured,
it is usually not possible to remove an existing reference from the
context via this mechanism. (Note that this can be permitted by changing
one of the Velocity configuration properties).
在velocity.properties里加入directive.set.null.allowed = true。
<service name="VelocityService" class="com.xxx.DefaultVelocityService" earlyInit="true">
<property name="input.encoding" value="GBK"/>
<property name="parser.pool.size" value="100"/>
<property name="directive.set.null.allowed" value="true"/>
.......
</service>