搜档网
当前位置:搜档网 › Velocity模板语言

Velocity模板语言

Velocity是由Apache软件组织提供的一项开放源码项目,它是一个基于Java的模板引擎。

网页制作者可以通过Velocity模板语言(Velocity Template Language,VTL)定义模板(template),并且在模板中不包含任何Java程序代码。Java开发人员编写程序代码来设置上下文,它包含了用于填充模板的数据。Velocity引擎能够把模板和上下文合并起来,生成动态网页。

VTL模板和JSP网页的区别在于:在VTL模板中不包含任何Java代码,并且VTL模板不同经过JSP编译器的编译,VTL模板的解释是由Velocity引擎来完成的。

尽管Velocity也可用于其它独立应用程序的开发,但其主要用途是简化Web应用开发。Velocity将Java代码从Web页面中分离出来,使Web站点在长时间运行后仍然具有很好的可维护性。

创建基于Velocity的Web应用包括两个步骤:
(1)创建Velocity模板;
(2)创建扩展VelocityServlet的Servlet类。

在Velocity模板语言中,"$"符号表示跟随其后的字符串为变量。如果要把"$"符号作为普通字符串处理,应该采用"\$"的形式。

VelocityServlet类,它是HttpServlet类的子类。它由两个重要方法:loadConfiguration方法handleRequest方法。
loadConfiguration方法类似于HttpServlet类的Init方法,区别在于loadConfiguration方法返回java.util.Properties对象。
handleRequest方法类似于HttpServlet类的doGet和doPost方法,区别在于handleRequest方法中增加了一个org.apache.velocity.context.Context类型的参数,Context类用来存放所有用于显示到HTML页面上的数据。

例子:
第一步,创建一个文件名为hello.vm的简单的模板文件,它的内容如下:$hello
第二步,创建扩展了VelocityServlet的HelloServlet类。
在它的loadConfiguration方法中把hello.vm模板所在的文件路径及Velocity日志文件路径作为属性存放在Properties对象中,然后返回Properties对象;
在handleRequest方法中把变量hello对应的数据存放在context对象中,handleRequest方法接下来获得hello.vm模板,然后返回代表hello.vm模板的Template对象。

注释:
在VTL中,单行注释的前导符为"##",对于多行注释,则采用"#*"和"*#"符号。

引用:在VTL中有3中类型的引用:变量、属性和方法。
变量引用:
变量引用的简略标记是由一个前导"$"字符后跟一个VTL标识符组成的。一个VTL标识符必须以一个字母开始,剩下的字符将由以下类型的字符组成:字母,数字,连字符,下划线。
给引用变量赋值有两种方法,一种办法是在Java代码中给变量赋值,此外,也可以在模板中通过#set指令给变量赋值,例如 #set($foo="bar") the output is $foo.

属性引用:
属性引用的简略标记是前导符$后跟一个VTL标识符,后面在跟一个点号("."),最后跟一个VTL标识符。

引用属性赋值有两种方法,一种办法是在Java代码中创建一个Hashtable对象,把所有的属性保存在这个Hashtable对象中,再把Hashtable对象保存在Context对象中。
给引用属性赋值的第二种办法是定义一个JavaBean类,定义各个属性对应的get和set方法,然后再Java代码中创建一个JavaBean对象,设置各个属性,再把它保存在Context对象中。

方法引用:
方法在Java程序代码中定义,VTL中的方法引用的简略标记为前导符"$"后跟一个VTL标识符,再跟一个VTL方法体。VTL方法体由一个VTL标识符后跟一个左括号,再跟可选的参数列表,最后是右括号组成。

正式引用符:
在大多数情况下,将使用引用的简略符号,但在一些特殊情况下,需要采用引用符来区分引用和普通的字符串。正式引用符常用在引用变量和普通文本直接邻近的地方。${}

安静引用符:
当Velocity遇到一个未赋值的引用时,会直接输出这个引用的名字。
安静引用符的前导字符为"$!"

转义符:VTL中的"$"具有特殊的含义,如果希望把"$"符号作为普通的字符来处理应该采用"\$"形式,其中"\"为转义符。

大小写替换:
Velocity借鉴了JavaBean的特征,能根据给定的JavaBean的属性名,自动调用相应的get方法。

模板设计员可以通过引用来输出动态网页内容,此外,还可以采用指令来灵活地控制网页的外观。

#set指令用来为应用变量或引用属性赋值,例如:#set( $primate = "money" )
赋值表达式的左边必须是一个变量引用或者属性引用,右边可以是下面的类型之一:
变量引用,字符串,属性引用,方法引用,数字,数组列表,简单的算术表达式。
如果赋值表达式的右边是一个属性或方法引用,并且取值是null,那么Velocity将不会把它赋值给左边的引用变量。在这种机制下,给一个已经赋值的引用变量重新赋值可能会失败,这是使用Velocity的新手常犯的错误。
当使用#set指定时,在双引号镇南关的字面字符串将被解析,当字面字符串被包括在单引号中时,将不被解析。

当#if指令中的if条件为真是,Velocity将输出#if代码块包含的文本。#if...#end
在#if语句中还可以包含#elseif和#else项,并且Velocity引擎将在遇到第一个为真的表达式时停止逻辑判断。
在#if条件表达式中,Velocity支持3中变量类型的比较运算:字符串比较,对象比较和整数比较。

#foreach指令用来构成循环代码。

#include指令用来导入本地文件,这些文件将被插入到模板中#include指令被定义的地方。
#include指令引用的文件名放在双引号内,如果超过一个文件,其间用逗号分隔开。
被包含的文件并不一定要直接给出文件名,事实上,最好的办法是使用变量

而不是文件名,这在需要根据特定逻辑来决定导入相应文件的情况下很有用。

#parse指令和#include指令很相似,两者都可以把其他文件导入到当前模板中,区别在于,#parse指令能够解析被导入的文件。此外,单个#parse指令只允许导入一个文件。与#include指令一样,#parse指令也允许文件名用变量表示。

#macro指令允许模板设计者在VTL模板中定义重复的段,称之为Velocity宏,Velocity宏不管是在复杂还是简单的场合都非常有用。把模板中重复的代码定义在一个Velocity宏中,则在模板中所有出现重复代码的地方都可以用宏来代替,这样使得模板更加简洁,易于维护。

当Velocity解析VTL代码时,其行为不受代码中的换行和空格的影响。

Velocity有一些内置的数学运算功能。
当进行除法运算时,得到的结果是整数。余数可以通过模运算"%"来获得。
在Velocity中,只有整数可以进行数学运算。如果执行非整数的数学运算,该操作将被记录到日志中,并返回null。

范围操作符可以定义包含Integer对象的数组,它常和#set或#foreach语句一起使用,范围操作符的形式为:[n..m]。
n和m都必须是整数。m大于或者小于n都没关系,在m小于n的情况下,数组下标从大到小计数。

字符串的连接:在VTL中,如果要连接字符串,只需要把这些字符串“放在一起”即可。

相关主题