在Chapter 2里,你已经了解了WEB开发者(负责界面设计)和WEB设计者(负责商业逻辑设计)是如何在一起配合工作的,你也看到了ASP、JSP和PHP语言是如何在后台操作数据的。在这一章里,我们将开始Velocity的探索之旅,并了解它是如何工作的。
Velocity是什么?
Velocity是一种让WEB设计者易于掌握和使用的模板语言,主要目的是简化WEB动态页面的开发。为了获取这种语言的支持,你需要JAVA基础类集合,才能在MVC的MODEL模型和VIEW组件之间搭建一座桥梁。Velocity最重要的一个特性就是它仅仅通过一组简单的语法(WEB设计者用于显示内容的语法)就能清晰地把VIEW和其他MVC组件之间区别开了。同时,JAVA编程人员只需集中精力关注应用的后台逻辑就行。
Velocity不但可以用于开发WEB页面,也可以用于开发独立运行的应用程序。它不仅能够输出HTML,也能输出其他类型的内容,比如:源代码、SQL或XML。Velocity的一些主要功能如下:
■包括用于操作页面内容的LOOP、条件语句的模板语言
■ 访问JAVA对象方法
■ 直接支持Turbine Web 应用框架
■ 利用Anakia转换XML到其他格式的内容
■ Texan
■ 直接支持servlets
它是如何工作的?
为了对Velocity有所了解,让我们考虑一下这个应用,该应用允许用户显示他们的个人详细信息。让我们假定在这个示例中,用户已经登录到这个应用系统,这里,我们需要创建一个显示页面来显示用户的登录信息。
页面设计
在MVC架构里,WEB设计者负责设计界面,WEB开发者负责后台逻辑,并确保设计者所设计的页面能够正确显示所需要的数据。第一步就是由WEB设计者完成可视化布局设计,设计者使用HTML标记创建一个包含了全部所需图片和文本的页面,对于动态信息,比如用户的account号和地址等,设计者使用占位符进行替代(比如:<**user account name**>)。
<HTML>
<HEAD>
<img src="header.jpg">
</HEAD>
<BODY>
Hello, <**user account name**>
</BODY>
</HTML>
Listing 3.1 The designer page example.
第二步,一旦完成页面可视化设计,设计者就应该和开发者召开一次会议,对动态内容(所使用的变量名称)进行讨论和确定,以保证页面能够正确显示。
获到正确的信息
在设计者和开发者之间召开的会议必须明确页面中需要插入动态内容的变量名称。这些变量名称将决定最终页面能否正确显示。
由于我们是使用MVC方式进行设计的,并且我们已经知道把JAVA代码放入WEB页面来获得内容不是正确的选择。Velocity为WEB设计者提供了一个脚本级的工作环境,它通过在HTML代码里放置脚本元素来产生一个模板。这些脚本元素由逻辑语句和访问JAVA对象的语法组成(比如loops和条件语句)。我们不要指望从VIEW组件里直接访问MODEL模型组件,因此Velocity需要一个可以在MVC各层之间传递数据,并且名叫上下文(Context)的集合。这个上下文对象内保存着控制器和模型组件,并提供给WEB页模板。
Velocity实现代码负责解析模板,并且用从上下文对象中获取的文本内容替换所有的Velocity脚本元素。一旦WEB设计者使用来自上下文的对象,这儿肯定需要一个设计者和开发者都理解的上下文对象名字约定。任何名字的不一致都将导致错误,这是因为Velocity是通过引用网页模板中的对象名字来进行数据传递的。
对信息进行编码Coding the Information
在设计者和开发者进行会议结束后,双方都将回去完成WEB开发最后的部分。在这一步中,MVC框架的优势是很明显的,因为设计者只需在WEB模板中增加脚本元素并加入双方约定的名称,而开发者则将开发焦点集中于如何返回约定名称的内容上。
对于开发者来讲,只有很少的工作需要去做,比如将新的页面集成到当前框架、确认当前用户的需要的信息(如:account number)是正确可用的,同时把设计者需要的数据放入上下文中。要注意的是,我们不能放弃前两步工作而直接跳到第三步上。
在许多以JAVA为基础的MVC应用中,用户实际浏览的页面是基于Servlet的。Servlet担当了MVC中的控制器角色。数据实体一般表现为模型,Session Bean可能考虑为控制器。控制器或Servlet负责把数据加入到上下文中。
一旦进行上下文和当前用户必须的动态数据的组装时(populate),开发者需要确定当前用户所请求使用的模板,然后将上下文中的数据并入模板中,最后生成HTML输出。Listing 3.2 显示了开发者在编码中必须要创建的基本语句。
Velocity.init();
VelocityContext context = new VelocityContext();
context.put( "name", new String("Jane Doe") );
Template template = Velocity.getTemplate("account.vm");
StringWriter sw = new StringWriter();
template.merge( context, sw );
Listing 3.2 Developer code for Velocity.
在Listing 3.2里,开发者首先要进行Velocity初始化工作,随后需要创建一个新的上下文。通过上下文的put()方法将一个字符串对象指派给关键字“name”,并且将字符串值"Jane Doe"粘贴到上下文中(此处的关键字“name”是先前设计者和开发者开会是约定的名称)。接着,使用getTemplate()方法获得(设计者创建的)模板。然后,用StringWriter来处理HTML输出。最后,模板和上下文被merge()方法合并到一起,并将最后的合并结果传送到StringWriter对象中保存,用于最后输入。
在这个示例中,许多细节被忽略。在下一节里,我们将用图例的方式来说明开发者为提供模板所需要的动态信息必须要做的工作。这在个示例里,我们指派了一个简单的字符串对象给上下文,同时也介绍了复合对象和如何使用Velocity来访问对象的属性和方法。
显示信息Displaying the Information
设计者或许可以很轻松的对已经设置好上下文和API的页面进行处理。使用Velocity模板语言(更广泛的讨论在Chapter 6里),所有的动态信息占位符被Listing 3.3所示的代码($name)替换。
<HTML>
<HEAD>
<img src="header.jpg">
</HEAD>
<BODY>
Hello, $name
</BODY>
</HTML>
Listing 3.3 Velocity Web页示例
在这里,用户名占位符被Velocity语句$name替换。当这个模板被上下文合并时,$name将被上下文中的名叫$name的对象的值替换。
Velocity 特性
在这个示例里,我们看到了如何使用一个在Velocity里定义的简单脚本元素和上下文来产生一个动态WEB页面的过程,这些定义都在MVC框架范围内。Velocity包含了许多别的特性,在这里,我们将通过以下介绍来了解其大概情况:
References—Velocity包含了三种类型的引用:变量、属性和方法。
变量以$符号开始,后紧跟英文符号或数字来进行定义。变量的值来自上下文同名的对象或直接量(Set idrective)。
属性以$符号开始,后紧跟英文符号或数字,而后是一点”.”,最后跟上别的定义。属性引用自上下文中JAVA对象的属性或调用对象方法返回的值。方法的定义必须是get<定义>这种格式。
方法以$符号开始,后紧跟英文符号或数字,而后是一点”.”,最后跟上别的定义和方法体(比如 (<parameter>))。A call is made to the exact method identifier specified(此句未译)。
Directives指令—Velocity指令允许WEB设计者控制所有引用。脚本元素包括set(为变量名指定值或叫直接量)、loop控制、条件和include指令。
Velocimacros Velocity宏—Velocimacro允许设计者构建多次重复使用的HTML和Velocity脚本元素宏。
Logging日志—Velocity利用log4J系统来产生日志。
Resource loaders资源加载—The resource loaders give you control over the templates used in the production of Web pages(此句未译).
Anakia—这是一个示例应用,它允许使用Velocity代替XSL (Extensible Stylesheet Language)来处理XML。
Application servers应用服务器—Velocity支持所有主流的应用服务器和Servlet,比如Resin, Tomcat, 和 BEA WebLogic等。
本章小节和下章介绍
在这一章里,我们提供了一个Velocity系统的快速浏览,解释了设计者和开发者是如何使用Velocity的。在下一章里,我们将开始学习Velocity和相关软件的安装。