蜗牛架构师

路走对了就不怕远。

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

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


阅读更多
文章标签: Velocity
个人分类: Java
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭