1. 变量
(1) 变量的定义:
1
2
3
4
5
6
7
|
#set($name = "hello") 说明:velocity中变量是弱类型的。
当使用#set 指令时,括在双引号中的字面字符串将解析和重新解释,如下所示:
#set($directoryRoot = "www" )
#set($templateName = "index.vm" )
#set($template = "$directoryRoot/$templateName" )
$template
输出将会是:www/index.vm
|
注:在velocity中使用$2.5这样的货币标识是没有问题得的,因为velocity中的变量总是以一个大写或者小写的字母开始的。
(2) 变量规范的写法
1
|
${name} ,也可以写成:$name。提倡用前面的写法。
|
(3) 变量的赋值:
1
2
3
4
5
|
$name="hello"
赋值的左边必须是一个变量或者是属性引用。右边可以是下面六种类型之一:
变量引用,字面字符串,属性引用,方法引用,字面数字,数组列表。
#set( $monkeySay = ["Not", $my, "fault"] ) ## ArrayList
通过索引取值方法:$monkeySay.get_item(0)
|
2. 循环
例子:
1
2
3
4
5
6
7
8
9
|
#set( $list = ["pine", "oak", "maple"])
#foreach ($element in $list)
$element index
is
$velocityCount
This
is
$element.<br>
#end
输出的结果为:
1 pine
is
1.
2 oak
is
2.
3 maple
is
3.
|
代码
//集合数据
1
2
3
4
5
6
7
8
9
10
11
12
|
List<
object
> users =
new
List<
object
>()
{
new
{Name =
"张三"
, age=20},
new
{Name =
"李四"
, age=24},
new
{Name =
"王五"
, age=30}
};
vc.Put(
"dtdataist"
,users);
调用:
#foreach($Item in $dtdataist)
$Item.name</br>
$Item.age</br>
#end
|
1
2
3
4
5
6
7
|
System.Data.DataTable userTable =
new
System.Data.DataTable();
userTable.Columns.Add(
"Name"
,
typeof
(
string
));
userTable.Columns.Add(
"Age"
,
typeof
(
int
));
userTable.Rows.Add(
"张三"
, 20);
userTable.Rows.Add(
"李四"
, 24);
userTable.Rows.Add(
"王五"
, 30);
vc.Put(
"dtdataist"
,userTable);
|
调用:
1
2
3
4
|
#foreach($Item in $dtdataist.Rows)
$Item.name</
br
>
$Item.age</
br
>
#end
|
//字典
1
2
3
4
5
6
7
8
|
//注: 进入foreach循环后的数据是KeyValuePair<T,T>对象.所以模板里是通过Key与Value属性取得键与值.
Dictionary<
string
,
int
> userDict =
new
Dictionary<
string
,
int
>();
userDict.Add(
"name"
, 20);
userDict.Add(
"李四"
, 24);
userDict.Add(
"王五"
, 30);
vc.Put(
"dtdataist"
,userDict);
调用:
$dtSubSortList.name
|
//数组
1
2
3
4
5
6
7
8
9
10
11
12
|
object
[] userArray =
new
object
[]{
new
{Name =
"张三"
, age=20},
new
{Name =
"李四"
, age=24},
new
{Name =
"王五"
, age=30}
};
vc.Put(
"dtdataist"
, userArray);
调用:
#foreach($Item in $dtdataist)
$Item.name</br>
$Item.age</br>
#end
|
支持加载对象多级属性调用 如:
1
2
3
4
5
6
7
|
vc.Put(
"monkey"
,
new
{ Say =
new
string
[] {
"Not"
,
"Yes"
,
"fault"
} });
调用:$monkey.Say.get_item(0) 显示:Not
支持加载多个对象数组 如:
#set($tdata=[["Name:王风","age:100"],["Name:wangfeng","age:100"]])
$tdata.get_item(0).Name 显示:王风
#set($tdataa=[["Name王志康","age100"],["Namewangfeng","age100"]])
$tdataa.get_item(0).get_item(1) 显示:age100
|
提示:velocity中大小写敏感,不支持属性为汉字 如:$dtdataList.张三。
Velocity还特别提供了得到循环次数的方法,$velocityCount变量的名字是Velocity默认的名字。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
这样可以通过$velocityCount%2==0 判断奇数偶数行。
each($data
in
$datas)
#before
this
before</br> #before--数据的开始处
#odd
$data
is
odd</br>#odd--数据的奇数处
#even
$data
is
even</br>#even--数据的偶数处
#each
$data
is
even</br>#each--可以循环美行数据
#between
this
is
between</br>每行数据的间隔处,如:1-2之间,2-3之间。
#after
after</br>--#after数据的结束处
#end
|
3. 条件语句
1
2
3
4
|
#if (condition)
#elseif (condition)
#else
#end
|
4. 语句的嵌套
1
2
3
4
5
6
7
8
9
10
|
#foreach ($element in $list)
## inner foreach 内循环
#foreach ($element in $list)
This
is
$element. $velocityCount <br>inner<br>
#end
## inner foreach 内循环结束
## outer foreach
This
is
$element.
$velocityCount <br>outer<br>
#end
|
语句中也可以嵌套其他的语句,如#if…#else…#end等。
5. 关系和逻辑操作符
Velocity 也具有逻辑AND, OR 和 NOT 操作符。
如
1
2
3
4
5
6
7
8
9
10
11
12
|
## example for AND
#if($foo && $bar)
<
strong
> This AND that</
strong
>
#end
## example for OR
#if($foo || $bar)
<
strong
> This OR that</
strong
>
#end
## example for NOT
#if(!$foo)
<
strong
> This NOTthat</
strong
>
#end
|
例子中#if() 指令仅在$foo 和$bar 都为真的时候才为真。如果$foo 为假,则表达式也为假;并且 $bar 将不被求值。如果 $foo 为真,Velocity 模板引擎将继续检查$bar的值,如果 $bar 为真,则整个表达式为真。并且输出This AND that 。如果 $bar 为假,将没有输出因为整个表达式为假。
6.Velocity 中的宏
Velocity中的宏我们可以理解为函数。
①宏的定义
1
2
3
|
#macro(宏的名称 $参数1 $参数2 …)
语句体(即函数体)
#end
|
②宏的调用
1
|
#宏的名称($参数1 $参数2 …)
|
说明:参数之间用空格隔开。
7.#stop
停止执行模板引擎并返回,把它应用于debug是很有帮助的。
8.#include与#parse
#include和#parse的作用都是引入本地文件, 为了安全的原因,被引入的本地文件只能在TEMPLATE_ROOT目录下。
区别:
(1) 与#include不同的是,#parse只能指定单个对象。而#include可以有多个
如果您需要引入多个文件,可以用逗号分隔就行:
1
|
#include ("template/one.gif" "template/two.txt" "template/three.htm" )
|
在括号内可以是文件名,但是更多的时候是使用变量的:
#set($seasonalstock ="template/test.htm")
#include ("template/greetings.txt" $seasonalstock)(注意中间没有分隔符)
(2) #include被引入文件的内容将不会通过模板引擎解析;
而#parse引入的文件内容Velocity将解析其中的velocity语法并移交给模板,意思就是说相当与把引入的文件copy到文件中。
#parse是可以递归调用的,例如:如果dofoo.vm包含如下行:
Count down.<br>
#set ($count = 8)
#parse ("parsefoo.vm")
<br>All done with dofoo.vm!
那么在parsefoo.vm模板中,你可以包含如下VTL:
$count
#set($count = $count - 1)
#if ( $count > 0 )<br>
#parse( "parsefoo.vm" )
#else
<br>All done with parsefoo.vm!
#end的显示结果为:
Count down.
8
7
6
5
4
3
2
1
0
All done with parsefoo.vm!
All done with dofoo.vm!
注意:在vm中使用#parse来嵌套另外一个vm时的变量共享问题。如:
->a.vm 里嵌套 b.vm;
->a.vm 里定义了变量 $param;
->b.vm 里可以直接使用$param,无任何限制。
但需要特别注意的是,如果b.vm里同时定义有变量$param,则b.vm里将使用b.vm里定义的值。
9.转义字符'\'的使用
如果reference被定义,两个’\’意味着输出一个’\’,如果未被定义,刚按原样输出。如:
#set($email = "foo" )
输出:
foo
\foo
如果$email 未定义
输出:
11.内置对象
Velocity内置了一些对象,在vm模版里可以直接调用,列举如下:
$request、$response、$session,目前还不清楚怎么调用。
12. 方法调用
代码
1
2
3
4
5
6
7
8
9
10
11
12
|
public
class
Tool
{
public
string
ConvertToString(
string
source)
{
return
html +
"_convert"
;
}
public
static
string
C2()
{
return
"test"
+
"_c2"
;
}
}
vc.Put(
"toolobj"
, tool);
|
调用方法:
1
2
|
$toolobj.ConvertHtml("123456");
$toolobj.C2();
|
多参数方法调用public static string SomeMethod(params String[] args)
{
return String.Join('-', args);
}
调用方法:$instance.SomeMethod('arg1', 'arg2')
12.模板文件调用
1
2
3
4
5
6
7
|
VelocityEngine ve =
new
VelocityEngine();
//模板引擎实例化
ExtendedProperties ep =
new
ExtendedProperties();
//模板引擎参数实例化
ep.AddProperty(RuntimeConstants.RESOURCE_LOADER,
"file"
);
//指定资源的加载类型
ep.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, HttpContext.Current.Server.MapPath(
"."
));
//指定资源的加载路径
//props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, Path.GetDirectoryName(HttpContext.Current.Request.PhysicalPath));
ep.AddProperty(RuntimeConstants.INPUT_ENCODING,
"utf-8"
);
//输入格式
ep.AddProperty(RuntimeConstants.OUTPUT_ENCODING,
"utf-8"
);
//输出格式
|
//模板的缓存设置
1
2
3
4
5
6
7
8
9
|
ep.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_CACHE,
true
);
//是否缓存
ep.AddProperty(
"file.resource.loader.modificationCheckInterval"
, (Int64)300);
//缓存时间(秒)
ve.Init(ep);
Template t = ve.GetTemplate(
"template/a.htm"
);
//加载模板
VelocityContext vc =
new
VelocityContext();
//当前的数据信息载体集合
vc.Put(
"list"
,
new
{users = GetList(), age = 20 });
//输入list标签的数据,模板标签为$list
........
t.Merge(vc, context.Response.Output);
//合并数据集合对象到输出流.
|
参考地址:
1.http://www.cnblogs.com/wysky/archive/2007/12/06/985832.html
2.http://student.csdn.net/space.php?uid=301568&do=blog&id=38145
3.http://www.castleproject.org/others/nvelocity/improvements.html
4.http://blog.csdn.net/zhanglei5415/archive/2010/08/04/5787131.aspx