牛骨文教育服务平台(让学习变的简单)
博文笔记

Velocity模板引擎#set在#foreach中无法赋值null问题

创建时间:2014-06-21 投稿人: 浏览次数:2794

在使用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>


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。