velocity一些容易出错点

36 篇文章 0 订阅
24 篇文章 0 订阅

velocity 属性引用中的属性查找规则
前己提及,属性可以引用到对象的命令. 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

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
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值