一、 问题:如何同时循环两个集合对象?
下面这种写法不行,$ages[这里只能是数字]
#set($names=["Bob", "Jack", "Lucy"])#set($ages=["12", "13", "11"])#foreach($name in $names) $name $ages[$velocityCount]#end
跟java一样即可,$map.get(这里是字符串)
#set($map={"Bob":"12", "Jack":"13", "Lucy":"11"})#foreach($m in $map.keySet) $m $map.get($m)#end#foreach($m in $map.entrySet) $m.key $m.value#end
二、 问题:velocity页面和后台数据类型不一致,导致调用后台方法失败
当后台定义的方法需要的参数类型为long,但是velocity页面定义的变量为int类型,就无法调用这个方法了。
其实很简单的,就跟java方法一样
#set($num = 1)$num.getClass() ##获取当前对象的类型$num.longValue() ##转换成对应的类型$num.byteValue()$num.toString()
又有人问了,如果是String类型的参数,怎么转换成int和long类型呢? String没有longValue(),没有intValue(),那就变通一下,如下:
#set($age = "18")$age.getClass() ##String类型#set($int = 0)##set一个Integer类型变量$int.parseInt($age) ##Integer是有parseInt()方法的$int.parseInt($age).getClass() ##这里是Integer类型了#set($long = $int.longValue()) ##没法直接set一个Long类型变量,可由Integer类型变量来变$long.parseLong($age)$long.parseLong($age).getClass() ##这里是Long类型了
如果嫌这样麻烦,完全可以定义一个ToolBox工具,来完成这些类型变量之间的转换
$TypeParseTool.parseStringToInteger("123")$TypeParseTool.parseStringToLong("123456")$TypeParseTool.parseNumToString(123)
三、break和stop指令
#foreach($a in [1..3]) #if($a == 2) #break #end $a#end#foreach($b in [10..12]) #if($b == 11) #stop #end $b#end这里是主体内容
结果如下:
1 10
和java中对应关键字一样,break:跳出当前循环,stop:停止当前页面的所有后续内容,可以做权限控制。 你肯定会问,那有continue指令么?velocity engine本身是没有continue指令的,可查看。如果想,那就自定义指令吧。
四、双引号和单引号的区别
#set($a = "hello")#set($b = $a+" world")#set($c = "$a world")#set($d = '$a world')$b$c$d
结果如下:
hello world hello world $a world
没错,双引号会将解析变量,单引号则会保持字符本身。
五、evaluate指令
#set($students=["lucy", "jack", "bob", "emmy"])#set($lucy_data = "165cm")#set($jack_data = "182cm")#set($bob_data = "175cm")#set($emmy_data = "176cm")#foreach($student in $students) #set($var = "$${student}_data") $student - #evaluate($var)#end
结果如下:
lucy - 165cm jack - 182cm bob - 175cm emmy - 176cm
作用就是根据变量名字符串,如”$bob_data“,”评估“出其实际值。有时候可以省很多事儿。