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

原创 2014年06月21日 16:32:59

在使用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——#foreach指令 $velocityCount

Velocity(7)——#foreach指令 首先是#foreach的简单示例: #foreach( $elem in$allElems)     $elem #end 上面这个例子中,$...
  • lululove19870526
  • lululove19870526
  • 2014年11月03日 17:46
  • 19495

一个velocity的#set指令赋值null的坑

#set($price = $item.sku.price) 如果在一个两次循环里 item.sku.price第一次是5.0,第二次是null,那么$price的值为两个5.0,因为默认情况下给...
  • joenqc
  • joenqc
  • 2017年06月29日 19:03
  • 285

Velocity用法以及注意事项

Velocity是一个基于java的模板引擎(template engine),缩写为VTL(velocity template language)。...
  • winy_lm
  • winy_lm
  • 2015年12月31日 17:33
  • 4333

velocity 各种判断为null或者“null”或者“”总结

在web开发中,经常会遇到一个需求是,判断变量为空(null)或者空字符串(""),从而影响页面的展示逻辑,velocity中有相应的方法可以判断。当然也可以在java后端转化到有效值再判断。以下是本...
  • qilixiang012
  • qilixiang012
  • 2015年07月07日 12:56
  • 3671

Velocity #set指令

#set指令用于向一个变量或者属性赋值。其格式为 #set($foo="bar")或者#set($foo.bar=$test) 。       LHS必须是一个变量或者属性,RHS必须是以下7种类型...
  • wanghjbuf
  • wanghjbuf
  • 2016年07月09日 15:01
  • 591

MFC edit控件实现自动换行

必须设置Vertical Scrollbar = TRUE 必须设置MultiLine = TRUE 必须设置Horizontal Scrollbar = FALSE 必须设置Auto HScr...
  • a200638012
  • a200638012
  • 2016年07月08日 17:22
  • 4804

设置MFC Edit control可以换行显示

MFC Edit control可以换行显示 1.设置edit control 属性Multiline为true 2.写入数据时,想换行的时候写入"\r\n"即可,CString str.Re...
  • a780902723
  • a780902723
  • 2014年12月09日 16:52
  • 2475

MFC中EDIT控件实现换行

一、通过回车换行: 这里要有两个设置 .将控件的属性设置为Mutilines->true; .将控件的另一个属性设置为Want return->true. 水平和垂直滚动条设置...
  • dearwind153
  • dearwind153
  • 2015年12月09日 21:13
  • 3896

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

在使用Velocity模板引擎作为Web应用页面渲染引擎,
  • mn11201117
  • mn11201117
  • 2014年06月21日 16:32
  • 2578

Velocity判断空的方法

Velocity中没有null,那么怎么判断null呢 1、在velocity中,非null被认为是真的,所以,可以用 #if($!变量名) // 变量不为空的代码 #else // 变...
  • u012814506
  • u012814506
  • 2015年08月04日 09:51
  • 1386
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Velocity模板引擎#set在#foreach中无法赋值null问题
举报原因:
原因补充:

(最多只允许输入30个字)