转载自:http://www.cnblogs.com/petermsdn/archive/2011/05/06/2039178.html

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

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

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

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

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

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

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

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

4、References(引用)

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

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

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

5、指令(directives)

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

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

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

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

The result of the first query is $result

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

The result of the second query is $result

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

The result of the first query is bill

The result of the second query is bill

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

#literal()

#foreach ($woogie in $boogie)

nothing will happen to $woogie

#end

#end

会输出::

#foreach ($woogie in $boogie)

nothing will happen to $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标签(jsp tag) 

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好。

Velocity浅析及与Jsp、Freemarker对比 分类: B1_JAVA 2014-07-21 09:14 637人阅读 评论(0) 收藏的更多相关文章

  1. Hdu 1507 Uncle Tom's Inherited Land* 分类: Brush Mode 2014-07-30 09:28 112人阅读 评论(0) 收藏

    Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  2. iOS开源库--最全的整理 分类: ios相关 2015-04-08 09:20 486人阅读 评论(0) 收藏

    youtube下载神器:https://github.com/rg3/youtube-dl 我擦咧 vim插件:https://github.com/Valloric/YouCompleteMe vi ...

  3. Jquery easy UI 上中下三栏布局 分类: ASP.NET 2015-02-06 09:19 368人阅读 评论(0) 收藏

    效果图: 源代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  4. C# IIS应用程序池辅助类 分类: C# Helper 2014-07-19 09:50 249人阅读 评论(0) 收藏

    using System.Collections.Generic; using System.DirectoryServices; using System.Linq; using Microsoft ...

  5. PIGS 分类: POJ 图论 2015-08-10 09:15 3人阅读 评论(0) 收藏

    PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18209 Accepted: 8277 Description Mir ...

  6. Babelfish 分类: 哈希 2015-08-04 09:25 2人阅读 评论(0) 收藏

    Babelfish Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 36398 Accepted: 15554 Descripti ...

  7. java 解决JFrame不能设置背景色的问题 分类: Java Game 2014-08-15 09:48 119人阅读 评论(0) 收藏

    这段时间比较多,于是写一写JAVA的一些IT技术文章.如有JAVA高手请加QQ:314783246,互相讨论. 在Java的GUI设计中,Frame和JFrame两者之间有很大差别,上次刚学时编一个窗 ...

  8. Poj 2528 Mayor's posters 分类: Brush Mode 2014-07-23 09:12 84人阅读 评论(0) 收藏

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 40570   Accepted: 11798 ...

  9. Poj 2349 Arctic Network 分类: Brush Mode 2014-07-20 09:31 93人阅读 评论(0) 收藏

    Arctic Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9557   Accepted: 3187 De ...

随机推荐

  1. Apache通用日志工具commons-logging和Log4j使用总结

    转自:https://blog.csdn.net/lzl13391522110/article/details/53758536 Apache通用日志工具commons-logging和Log4j使用 ...

  2. IPod在Linux下的实战

    刚收到一个朋友送的Ipod,经过研究今天我为大家分享一点在Linux系统下使用的经验.Apple的iPod它炫目时尚,超薄还可以俘储大量歌曲,这使得iPod十分流行.但流行的同时也带来了一些问题, 在 ...

  3. Java学习笔记五 常用API对象一

    常用API:字符串操作:String类,StringBuffer类,StringBulider类 字符串是最重要的数据类型之一,处理字符串也是一种语言的基本工作. 1.String类: public ...

  4. 洛谷 P2504 [HAOI2006]聪明的猴子

    洛谷 P2504 [HAOI2006]聪明的猴子 题目描述 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水 ...

  5. 怎样 TabHostFragment自己定义 tab键(indicator)

    1 获得 tabHostFragment: ActionBarActivity activity2 = (ActionBarActivity) activity; mTabHost = new Fra ...

  6. 内网使用 IPV6 之 TunnelBroker隧道(6in4)篇

    内网使用 IPV6 之 TunnelBroker隧道(6in4)篇 据非专业网民推测 tunnelbroker isatap 和 6to4  貌似都需要公网,但有网民测试这位大作的方法可行.特别之处是 ...

  7. ProgressBar-style属性分析

    首先我们看下framework下关于进度条的style定义,如下 <style name="Widget.ProgressBar"> <item name=&qu ...

  8. 推荐一款优雅高效的免费在线APP原型工具

    有段时间没有推荐干货给大伙了,今天是时候把压箱底的东西拿出来分享给大家了! 想要学习原型图绘制的小伙伴可以看过来,适合零基础的小白,五分钟就可以上手,绘制自己想要的产品原型图. 官方介绍:用户只需输入 ...

  9. Java Web学习总结(7)——HttpServletRequest对象

    一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...

  10. 下拉列表,点击选择实现跳转链接 onchange="window.location=..."

    <select onchange="window.location=this.value;"> <option value="a.html"& ...