velocity一些容易出错点
velocity 属性引用中的属性查找规则
前己提及,属性可以引用到对象的命令. Velocity 会使用合适的策略选择引用到的命令. 它会根据协定
的命令命令格式查找. 无论属性引用的的名字是否大小写,Velocity 都有固定的查找规则.如在
$customer.address 引用时,查找顺序是:
1.getaddress()
2.getAddress()
3.get("address")
4.isAddress()
对于VTL中大写的属性名 Address 引用,将是:
1.getAddress()
2.getaddress()
3.get("Address")
Directives(指令符号)
#set 指令
前己提及,属性可以引用到对象的命令. Velocity 会使用合适的策略选择引用到的命令. 它会根据协定
的命令命令格式查找. 无论属性引用的的名字是否大小写,Velocity 都有固定的查找规则.如在
$customer.address 引用时,查找顺序是:
1.getaddress()
2.getAddress()
3.get("address")
4.isAddress()
对于VTL中大写的属性名 Address 引用,将是:
1.getAddress()
2.getaddress()
3.get("Address")
4.isAddress()
Escaping Valid VTL References(封装有效的引用)
## The following line defines $email in this template:
#set( $email = "foo" )
$email
\$email
\\$email
\\\$emailv
上面的模板在 web 页面上的输出将是:
foo
$email
\foo
\$email
但如果 email 并没有定义,我们这样写:.
$email
\$email
\\$email
\\\$email
输出就原封不动了:
$email
\$email
\\$email
\\\$email
Case Substitution(可选的格式)
$foo $foo.getBar() ## 等同于 $foo.Bar $data.setUser("jon") ##等同于 #set( $data.User = "jon" ) $data.getRequest().getServerName() ##等同于 $data.Request.ServerName ## is the same as ${data.Request.ServerName}
Directives(指令符号)
指令总是以 #开头后面紧跟具体的指令符. 就像引用一样(指令的一种),可以将指令理解为”表示这里 是一个什么东东).如下例生成一个出错提示: #if($a==1)true enough#elseno way!#end 这个例子中应使用括号将 else 分开. #if($a==1)true enough#{else}no way!#end
#set 指令
“左操作数被赋值“是引用操作的一个规则.=号右侧可能是以下类型之一:
Variable reference 变量引用
String literal 字符串
Property reference 属性引用
Method reference 命令引用
Number literal 数字
ArrayList 数组
#set( $monkey = $bill ) ## variable reference #set( $monkey.Friend = "monica" ) ## string literal #set( $monkey.Blame = $whitehouse.Leak ) ## property reference #set( $monkey.Plan = $spindoctor.weave($web) ) ## method reference #set( $monkey.Number = 123 ) ##number literal #set( $monkey.Say = ["Not", $my, "fault"] ) ## ArrayList #set( $monkey.Map = {"banana" : "good", "roast beef" : "bad"}) ## Map.Literals (语义解析)
使用#set 指令时,变量如果用 “”引起会被解析,如: #set( $directoryRoot = "www" ) #set( $templateName = "index.vm" ) #set( $template = "$directoryRoot/$templateName" ) $template
输出的将是: www/index.vm
但当用单引号引起来时,就不会被解析:: #set( $foo = "bar" ) $foo #set( $blargh = '$foo' ) $blargh 输出后会是: bar $foo
另外, 指令 #literal 元素可以用来输出字面意思,如下示. #literal() #foreach ($woogie in $boogie) nothing will happen to $woogie #end #end 会输出:: #foreach ($woogie in $boogie) nothing will happen to $woogie #end
Include(引入) #include 脚本元素让模板设计者可以在模板中引入一个本地文件, 这个被引入的文件将不会经过 Velocity 的解析. 安全起见,可以引放的文件只是是配置参数 TEMPLATE_ROOT 所定义目录下的,默认为 当前目录下. #include( "one.txt" ) 如果需要引入多个文件,可以像下面这样. #include( "one.gif","two.txt","three.htm" ) 当然,还可用一个变量名来代替文件名引入. #include( "greetings.txt", $seasonalstock )
#stop 指令用来指示在模板的某处,engine 停止解析,这一般用来调用。用法很简单. #stop
可否通过 #parse()来注册一个宏 ? 宏必须在模板使用前定义好.前面己有一个关于此问题的建议,#parse()是运行时执进的,JVM 查找对象 的顺序不一定会全按我们预计的执行。 什么是宏的自动重新装载? 这是由配置参数决定的, 为方例开发者,在生产环境中则不需要 : velocimacro.library.autoreload 默认的是 false.当设为 true 中,需要设定 chcheing 参数; <type>.resource.loader.cache = false (具体配置请见开发指南,如下是一个配置的例子) file.resource.loader.path = templates file.resource.loader.cache = false velocimacro.library.autoreload = true