Velocity浅析及与Jsp、Freemarker对比

80183053 2011-08-21

Velocity是一个基于java的模板引擎(templateengine).它可以让视图的设计者在web页面中引用java代码中定义的数据对象和命令。从而使Webdesigners和java开发者依照MVC思想(Model-View-Controller)开发系统,这意味着Webdesigners只须将精力注用于良好表现力的视图外观设计,而Java程序员则只要关心着如何写出高效简洁的java对象以实现业务逻辑—–Velocity会将他们组装到一起.

相比传统的jsp、PHP等脚本语言,Velocity彻底的将避免了在视图设计中出现的java代码,从而保证了website的长期可维护性.

Apache站点提供的另外一个框架Turbine可以和Velocity有效结合以实现trueMVCmodel.

一、我们来简要看看Velocity模板语言(VTL)

1、VTL声明(statement),所有的VTLstatement都是以#开头,且包含一个指示符,当客户访问你的页面时,theVelocityTemplatingEngine将搜索页面中的所有#符号,如果确定这是一个VTL声明时就按一定规则处理动态内容,符号#仅仅只是表明这可能是一个VTL声明.

2、VTL注释:单行注释是以##开头的一行文字.如要写下多行注释,将它们放入#*和*#间

3、Velocityreferences从java语法中汲取了一些优点以便模板设计者更容易使用VTL.

VTL汲取了java语法和javabean的一些简洁语法以解析java代码中Context中的对象和这些对象的命令及属性—这样,一个java对象的所有功能都可以展示到视图中了.

4、References(引用)

VTL中有三种references:变量引用(variables),属性引用(properties)和命令引用(methods).做为一个使用VTL的设计者,你和你的java软件工程师必须就模板中引用的特定名了(就是$后的名字)达成一致的协议!这样,模板和java代码才可按照你们的意图去结合以输出正确的内容.

所有的引用在模板中都表现为一个字符串.假设一个引用变量$foo的值事实上是一个int,Velocityengine在处理时将调用它的.toString()去解析这个字符串所代表的对象(int).

注意:模板中引用的必须是通过javaBean中的getter/setter实现的,而直接的java对象的数据域是不能直接引用的,如$foo.Name会解析到classFoo’sgetName()的实例方法,但不会解析到Foos类的publicName这个实例变量.

5、指令(directives)

模板设计者使用“引用“生成动态内容,指令(directives)–简单的说就是设计者在模板中操作java对象—让视图设计者全面控制输出内容的格式.

指令总是以#开头后面紧跟具体的指令符.

注意:set指令中,如果右边的操作数是一个属性或命令的引用而返回null,那么赋值将不会成功,且在随后的VTL中也不能再取出使用.如下例:

#set($result=$query.criteria(“name”))

Theresultofthefirstqueryis$result

#set($result=$query.criteria(“address”))

Theresultofthesecondqueryis$result

如果$query.criteria(“name”)返回的是字符串”bill”,但$query.criteria(“address”)返回null,上面的TVL输出结果将是:

Theresultofthefirstqueryisbill

Theresultofthesecondqueryisbill

6、指令#literal元素可以用来输出字面意思,如下:

#literal()

#foreach($woogiein$boogie)

nothingwillhappento$woogie

#end

#end

会输出::

#foreach($woogiein$boogie)

nothingwillhappento$woogie

#end

7、属性引用中的属性查找规则

前己提及,属性可以引用到对象的命令.Velocity会使用合适的策略选择引用到的命令.它会根据协定

的命令命令格式查找.无论属性引用的的名字是否大小写,Velocity都有固定的查找规则.如在

$customer.address引用时,查找顺序是:

1.getaddress()

2.getAddress()

3.get(“address”)

4.isAddress()

对于VTL中大写的属性名Address引用,将是:

1.getAddress()

2.getaddress()

3.get(“Address”)

4.isAddress()

8、Velocity使用==来做比较

注意:==计算与java中的==计算有些不同:不能用来测试对象是否相等(指向同一块内存)Velocity中是否相等仅直接的用来比较numbers,strings的值,orobjects的toString()结果是否相等.如果是不同的对象,会调用它们的toString()命令结果来比较.

9、当Velocity应用余应用程序时,一般分一下几步:

(1)、初始化Velocity

(2)、创建context对象

(3)、添加数据到context

(4)、选择模板

(5)、合并模板和数据,产生输出页面

二、Velocity与Jsp、Freemarker的对比

在java领域,表现层技术主要有三种:jsp、freemarker、velocity。

jsp是大家最熟悉的技术

优点:

1、功能强大,可以写java代码

2、支持jsp标签(jsptag)

3、支持表达式语言(el)

4、官方标准,用户群广,丰富的第三方jsp标签库

5、性能良好。jsp编译成class文件执行,有很好的性能表现

缺点:

jsp没有明显缺点,非要挑点骨头那就是,由于可以编写java代码,如使用不当容易破坏mvc结构。

velocity是较早出现的用于代替jsp的模板语言

优点:

1、不能编写java代码,可以实现严格的mvc分离

2、性能良好,据说比jsp性能还要好些

3、使用表达式语言,据说jsp的表达式语言就是学velocity的

缺点:

1、不是官方标准

2、用户群体和第三方标签库没有jsp多。

3、对jsp标签支持不够好

freemarker

优点:

1、不能编写java代码,可以实现严格的mvc分离

2、性能非常不错

3、对jsp标签支持良好

4、内置大量常用功能,使用非常方便

5、宏定义(类似jsp标签)非常方便

6、使用表达式语言

缺点:

1、不是官方标准

2、用户群体和第三方标签库没有jsp多

性能:velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差,但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tag和el的jsp好。

相关推荐

lionelf / 0评论 2020-07-28