Velocity技术调查
模板引擎的设计思想最早由Webmacro提出,并被应用在一个著名的搜索引擎www.altavista.com上。
后来,这种思想渐渐被
Apache
开发小组所采用,并作为一个子项目被提出来,这就是现在的
Velocity
。
Velocity是什么?
Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来
引用由java代码定义的对象[dwr似乎也是做这样的工作,不过后者更具体,甚至延伸方法]。
当
Velocity
应用于
web
开发时,界面设计人员可以和
java
程序开发人员同步开发一个遵循
MVC
架构的
web
站点,也就是说,页面设计人员可以只关注页面的显示效果,而由
java
程序开发人员关注业务逻辑编码。
Velocity
将
java
代码从
web
页面中分离出来【放到哪里去?jsp的taglib也做了同样的工作,现在Velocity给我的印象,只是把jsp页面的数据分离出来放到其他地方了?】,这样为
web
站点的长期维护提供了便利,同时也为我们在
JSP
和
PHP
之外又提供了一种可选的方案。
Velocity的能力远不止web站点开发这个领域,例如,它可以从模板(template)
产生SQL和PostScript、XML,它也可以被当作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用。
Velocity能为我们作什么?
你可能因为下面几种原因而使用
Velocity:
1:
它很容易集成在各种各样的程序领域中。
2:
它为网页制作人员提供了一种清晰而又简单的语法
3:
因为模板和代码是分离的,所以你可以分别独立的开发和维护它们。
4:Velocity
引擎可以很容易的集成到一些
Java
运行环境,特别是
Servlet
.
5:Velocity
使得模板可以访问任何环境对象中的共有方法。
Velocity
的强大之处在于它严格的区分程序开发功能的职责划分。 它限制模板可能访问的对象(也就是后台程序允许它得到的对象)来实现这一点。这意味着,网页设计人员可以只把精力放在数据的显示部分(
View
视图)而程序员则只要关注如何写好程序的控制层(
Controller,
控制器)和商业逻辑和数据管理(模型
Model
)
,
这就是
MVC
开发模式。
MVC
现在已经是广泛接受的一种开发模式,它简化了开发和日益复杂的应用和维护工作。
例如:
假设你是一家专门出售
Mud
的在线商店的页面设计人员,让我们暂且称它为“在线
MUD
商店”。你们的业务很旺,客户下了各种类型和数量的
mud
订单。他们都是通过输入用户名和密码后才登陆到你的网站,登陆后就允许他们查看订单并购买更多的
mud
。现在,一种非常流行的
mud
正在打折销售。另外有一些客户规律性的购买另外一种也在打折但是不是很流行的
Bright Red Mud
,由于购买的人并不多所以它被安置在页面的边缘。所有用户的信息都是被跟踪并存放于数据库中的,所以某天有一个问题可能会冒出来:为什么不使用
velocity
来使用户更好的浏览他们感兴趣的商品呢?
Velocity
使得
web
页面的客户化工作非常容易。【这算什么例子,什么问题都没有说明】
Velocity的工作流程和原理
Velocity
是一个源代码开放的
Java
模板引擎
简单地说,模板引擎的作用就是取得数据并加以处理,最后显示出数据【而我关心的是mvc分离,如何使用java对象,他这里并没有把Velocity的核心功能,即服务器上的Velocity技术体现出来】。例如,假设有一个企业职工的清单,我们可以用模板引擎将它以
HTML
页面的形式显示在企业的
Intranet
上,或简化后显示在管理员的手机上。使用模板引擎的好处就在于开发者和设计者能够以最合适的方式操作和利用数据,
Velocity
就是一个模板引擎的绝佳范例。
Velocity
的英文含义是“速度、流通速度、速率;迅速,快速”,也许它的作者希望
Velocity
能够提高人们开发
Web
应用的速度吧。
当
Velocity
应用于一个
application program
或
a servlet
,
你通常将做下面的事情
1.
初始化
Velocity
.
2.
创建
Context
对象
3.
添加数据到
Context
4.
选择模板
5.
合并模板和你的数据产生输出页面
In
code
Using
the singleton pattern via the
org.apache.velocity.app.Velocity
class, this looks like
import java.io.StringWriter;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.MethodInvocationException;
Velocity.init();
VelocityContext context = new VelocityContext();
context.put( "name", new String("Velocity") );
Template template = null;
try {
template = Velocity.getTemplate("mytemplate.vm");
}
catch( ResourceNotFoundException rnfe )
{ // couldn't find the template }
catch( ParseErrorException pee )
{ // syntax error : problem parsing the template } catch( MethodInvocationException mie )
{ // something invoked in the template // threw an exception } catch( Exception e )
{}
StringWriter sw = new StringWriter();
template.merge( context, sw );
Velocity的国际化
Velocity本身支持模版的国际化编码转换,看看Velocity提供的方法:
Public Template getTemplate (Stirng template, String encoding),
另外
,
在
Velocity的tools: MessageTool,提供了变量text包含国际化标签,这样只需要简单的编写标签代码即可,如:$text.get(‘title’).
Velocity对Framework的支持
1. Velocity Tools / VelocityViewServlet
对Servlet的支持,使用VelocityViewServlet来代替Servlet.
2. Velocity Tools / VelocityStruts
对Struts的支持.
3. Third party frameworks
对第三方框架的支持,比如:Spring,Turbine等.
Velocity的优点和缺点
充分体现MVC的核心思想,即:功能模块化。将HTML技术和复杂的业务逻辑拆分.Velocity的优点就在于其简单的模板语法以及成功实现对内容和显示方式的分离。有了Velocity,开发者可以专注于程序代码,设计者可以专注于页面的布局和视觉效果,不必再担心要在模板中嵌入各种程序代码。与传统的用JSP和PHP构造页面的方式相比,这显然是一大进步。在传统的JSP、PHP页面中,
程序逻辑嵌入到Web页面中,从而为理解和维护Web页面带来很大的麻烦。Velocity模板引擎成功地解决了这一问题。
Velocity的主要缺点是在于异常处理以及日志上。
Velocity总结
:
Velocity 解决了如何在 Servlet 和 网页之间传递数据的问题,当然这种传输数据的机制是在 MVC 模式上进行的,也就是View 和 Modle , Controller 之间相互独立工作,一方的修改不影响其他方变动,他们之间是通过环境变量(Context)来实现的,当然双方网页制作一方和后台程序一方要相互约定好对所传递变量的命名约定,比如上个程序例子中的 site, name 变量,它们在网页上就是 $name ,$site 。
这样只要双方约定好了变量名字,那么双方就可以独立工作了。无论页面如何变化,只要变量名不变,那么后台程序就无需改动,前台网页也可以任意由网页制作人员修改。这就是
Velocity
的工作原理。
你会发现简单变量名通常无法满足网页制作显示数据的需要,比如我们经常会循环显示一些数据集,或者是根据一些数据的值来决定如何显示下一步的数据,
Velocity
同样提供了循环,判断的简单语法以满足网页制作的需要。
Velocity
提供了一个简单的模板语言以供前端网页制作人员使用,这个模板语言足够简单(大部分懂得
javascript
的人就可以很快掌握,其实它比
javascript
要简单的多),当然这种简单是刻意的,因为它不需要它什么都能做,
View
层其实不应该包含更多的逻辑,
Velocity
的简单模板语法可以满足你所有对页面显示逻辑的需要,这通常已经足够了,这里不会发生象
jsp
那样因为一个无限循环语句而毁掉系统的情况,
jsp
能做很多事情,
Sun
在制定
Jsp 1.0
标准的时候,没有及时的限定程序员在
jsp
插入代码逻辑,使得早期的
jsp
代码更象是
php
代码,它虽然强大,但是对显示层逻辑来说,并不必要,而且会使
MVC
三层的逻辑结构发生混淆。