今天在使用nvelocity模版的时候遇到一个问题,参考示例代码如下:
2 < input type ="text" name ="username" />
3 < input type ="text" name ="age" value ="-1" />
4 < input type ="submit" value ="submit" />
5 </ form >
6 #if($age < = 1 )
7 age 变量是以数值进行比较
8 #end
此时的submit请求url 则显式为..target.rails?username=name&age=-1
然而,#if($age <= 1)的判断条件却并不成立,想来nvelocity模版引擎是将所有从url请求得来的参数值,均以字符串类型来进行保存,自然,对于判断条件的比较也是以字符串来进行.所以当..target.rails?username=name&age=10,判断条件变为#if($age <= 3)时,返回为true,明显的,nvelocity并未将变量在判断条件中进行类型转换操作后再进行判断.
不过在Controller 中使用PropertyBag.Add("age",-1)向nvelocity模版输出变量age,则将自动由nvelocity模版引擎转换为数字类型进行保存,#if($age <= 1)表达式成立,生成html页面打印"age变量是以数值进行比较".
这个问题,不知道这算不算是nvelocity的一个BUG更或者其本身定义就是如此.当然,直接通过url传递参数也可以通过#set($age = $age + 0) 表达式进行一次计算操作,nvelocity引擎将会对在运算中对自动对$age变量进行数据类型转换,之后,再使用#($age <= -1)则自然就返回为True了.