在之前的章节里,我们介绍了Velocity和Hello World示例,并从中看到了Velocity的一些简单应用,是时候学习Velocity核心组件了。本章将深入学习模板和上下文。后续章节将在本章知识的基础上,详细讨论Velocity的引用、指令和宏。
使用模板
Velocity是一个模板引擎,使用Velocity进行开发将是一件非常愉快的事。但是如何来制作模板呢?Velocity的模板定义和许多领域使用的模板概念相似,比如许多文本处理包为通用文档提供了文档处理的预定义包,如office备忘录等,这些都与Velocity模板的概念相当接近。Velocity俱乐部应用程序窗体(详见Figure 6.1)是常规模板的另一个例子。
Figure 6.1An example of a general template.
Velocity俱乐部应用程序的内容包含了两个部分的内容:静态内容和动态内容。静态内容由标题、标签(如:First Name:,Last Name:等)、问题和全部的布局等组成;动态内容就是表单中的下划线部分,用于申请人填写个人信息。
普通模板定义(如Velocity俱乐部应用程序的模板)和真实的Velocity模板最大的不同之处在于,Velocity的动态内容是指定的。当应用程序窗体依赖于插入空白部分的动态内容时,Velocity使用了引用的概念。现在,你可以简单想一下,Velocity引用就好比某种实体引用了一个存储在别处的值。比如,基于Velocity引用的基本语法,一个模板或许包含了一个名叫$name的实体和字符串“John Doe”对应,该字符串一般存储在模板外的某个地方(如数据库)。如果你对这个含糊的定义有些困惑的话,请不要太担心,我们将在下章详细讨论引用的细节,重要的是要紧记Velocity引用从本质上来讲是作为模板中动态内容的占位符。如果你想把这个俱乐部应用程序转换成Velocity模板,只需要把那些空白部分替换成适当的Velocity引用就行。如何制定一个适当的Velocity引用定义?首先定义要符合Velocity引用语法,其次是设计者和编程人员要对模板引用的名称进行约定。一种可能的模式实现详见Listing 6.1。
CLUB VELOCITY APPLICATION
First Name: $firstName
Last Name: $lastName
Address: $streetAddress
City: $city State: $state Zip: $zip
Phone Number: $phoneNumber
Email Address: $emailAddress
Occupation: $occupation
Other Interests: $otherInterests
Is this a new membership request or a renewal? $appType
How long have you been using Velocity? $useTime
Do you use Velocity for work or play? $useType
Do you want to receive our newsletter? $wantNewsletter
Listing 6.1The club application form after conversion to a Velocity template.
正如你所看见的一样,Velocity模板从本质上讲,和应用程序原来的窗体是相同的,除了空白地方被Velocity引用替换外。下面我们先假定引用的值分别如下:
$firstName => "John"
$lastName => "Doe"
$streetAddress => "123 Jane Ave. "
$city => "Azusa"
$state => "CA"
$zip => "91702"
$phoneNumber => "626-555-1234"
$emailAddress => "john@nodom.com"
$occupation => "Web Developer"
$otherInterests => "Hiking,Biking"
$appTyp