前述:
基于Java的网站开发,很多人都采用JSP作为前端网页制作的技术,尤其是在国。这种技术通常会存在一些问题,可以通过简单地分析网站开发过程来看看这些问题。通常网站开发采用以下两种方式:
◆ 网站功能确定后,由美工设计网页的UI(界面)部分,然后由程序员在其上加入代码显示逻辑(比如循环、判断显示数据结果)。这就是通常的JSP页面制作,当然这部分可以由美工完成模板,然后由JSP工程师以它为原型创建相应的JSP页面。
◆ 网站功能确定后,由美工设计网页的UI(界面)部分,然后由网页制作人员在其上加入代码显示逻辑(比如循环、判断显示数据结果)。在这一步的JSP页面制作中,网页制作人员通常只需要懂JavaScript和HTML,在工程师的指导下学会如何嵌入JSP taglib标记,然后以美工的模板为原型制作JSP网页。
显然后一种方式要比前一种方式分工明确。然而在很多小公司,或者项目紧急的情况下,JSP网页制作和后台程序开发都是同一个人,这样无疑加大了程序员的负担。后一种情况也有两个缺点,一是网页制作人员必须学会如何使用JSP taglib,这将加大网页制作人员的负担;二是如果页面因为客户的要求重新设计,那么无论哪种情况,网页制作人员都要将显示逻辑重新嵌入JSP网页。
虽然从性能角度和taglib的使用上来说,JSP比PHP和ASP做得要好,但它在设计上同样类似PHP这种服务器页面语言,即在页面中嵌入脚本语言的技术。这使得它虽然比传统基于CGI脚本语言的开发模式速度快,但却将后台程序逻辑与页面显示混淆。
用MVC模式开发网站
现在更多的网站制作采用一种称为MVC的模式,也就是将网站制作工作分工,分为M(Model,模型)、V(View,视图)和C(Controller,控制器)。
◆ M(Model,模型) M包括后台的事务逻辑、真正处理事务的代码和商业逻辑等,它们是整个网站最重要的工作部分。通常这部分代码相对比较稳定,不会经常变动,就是有所变动也不会对前端的页面产生影响。
◆ V(View,视图) V是网页的显示部分,这部分接受来自后台程序的结果或数据,进行显示。V视图通常是变化比较大的部分,比如网站界面的每日更新,每隔一段时间更新网页风格等都会造成V视图部分的大量更改工作。
◆ C(Controller,控制器) C在视图和模型之间传递控制,并根据要求调用相应的视图显示模型返回的数据,主要负责调度工作。
这种职责的分工到底有什么好处呢?它简化了软件开发过程中所有相关人员的工作,使不同部分的修改通常不会影响到其它部分的工作。比如,修改后台某些程序的算法并不影响前台的页面显示,前台页面的修改也不影响后台程序的开发。
这种分工合作比起JSP混淆代码逻辑和显示层的方式要好得多。所以越来越多的国外程序员在不断提出替代JSP的方案。在众多方案中,基于Java模板引擎的技术脱颖而出,其中著名的有Velocity和Webmacro两种模板技术。
模板引擎的设计思想最早由Webmacro提出
模板引擎有什么用?
简单地说,模板引擎的作用就是取得数据并加以处理,最后显示出数据。例如,假设有一个企业职工的清单,我们可以用模板引擎将它以HTML页面的形式显示在企业的Intranet上,或简化后显示在管理员的手机上。使用模板引擎的好处就在于开发者和设计者能够以最合适的方式操作和利用数据,Velocity就是一个模板引擎的绝佳范例,它的官方解释是:“Velocity是一种基于Java的模板引擎,它允许任何人使用简单而强大的模板语言来引用定义在Java代码中的对象。” Velocity的英文含义是“速度、流通速度、速率;迅速,快速”,也许它的作者希望Velocity能够提高人们开发Web应用的速度吧。
Velocity代表了新一代的潮流,比如:
假设你是一家专门出售Mud的在线商店的页面设计人员,让我们暂且称它“在线MUD商店”.你们的业务很旺,客户下了各种类型和数量的mud订单.他们都是通过输入用户名和密码后才登陆到你的网站,登陆后就允许他们查看订单并购买更多的mud.现在,一种非常流行的mud正在打折销售.另外有一些客户规律性的购买另外一种也在打折但是不是很流行的Bright Red Mud,由于购买的人并不多,所以它被安置在页面的边缘。所有用户的信息都是被跟踪并存放于数据库中的,所以某天有一个问题可能会冒出来:为什么不使用velocity来使用户更好的浏览他们感兴趣的商品呢?
Velocity使得web页面的客户化工作非常容易。作为一个web site的设计人员,你希望每个用户登陆时都拥有自己的页面.
使用Velocity的优点在于:
◆ 很容易集成在各种各样的程序领域中;
Velocity最初是为了改进WebMacro Servlet框架而构建的,发展到现在已衍生出各种非Servlet环境的用途。
◆ 为网页制作人员提供了一种清晰而简单的语法;
◆ 因为模板和代码是分离的,所以可以分别独立的开发和维护它们;
Velocity的优点在于其简单的模板语法以及成功实现对内容和显示方式的分离。有了Velocity,开发者可以专注于程序代码,设计者可以专注于页面的布局和视觉效果,不必再担心要在模板中嵌入各种程序代码。
◆ Velocity引擎可以很容易地集成到一些Java运行环境,特别是Servlet中;
◆ Velocity使得模板可以访问任何环境对象中的共有方法。
Velocity的强大之处在于它严格地区分程序开发功能的职责划分。它通过限制模板可能访问的对象(即后台程序允许其得到的对象)来实现这一点。这意味着网页设计人员可以只把精力放在数据的显示部分(View),而程序员则只要关注如何写好程序的控制层(Controller)、商业逻辑与数据管理(Model)。这就是典型的MVC开发模式,它简化了开发和日益复杂的应用和维护工作。
不过,Velocity用得最多的还是在基于Java Servlet的网页程序中做生成网页的引擎,以替代JSP等技术。除了使用比较容易外,它提供了强大的模板语言来显示和操作数据。注意,不是生成数据,这点很重要,因为生成工作应该是程序逻辑的部分。
Velocity的能力远不止web站点开发这个领域,例如,它可以从模板(template)产生SQL和PostScript,XML,它也可以被当作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用.Velocity也可以为Turbine web开发架构提供模板服务(template service).Velocity+Turbine提供一个模板服务的方式允许一个web应用以一个真正的MVC模型进行开发.
Velocity最擅长做的工作包括:
◆ 基于Servlet的网站制作;
◆ Java和SQL代码生成;
◆ XML处理和转换;
◆ 文字处理,比如生成trf文件等。
Velocity是如何工作的?
Velocity要求至少有两个文件来显示一个页面——即一个模板和一个Java类。
任何Velocity的应用都包括模板制作和程序部分两个方面。
下面我们通过一个简单的例子了解Velocity如何分离数据本身及其显示。
一个简单的例子:
首先要下载和安装Velocity。下载好之后,解开压缩,把velocity-dep-1.x.x.jar加入到CLASSPATH。
通常,Velocity模板的文件后缀是“.vm”。下面我们要创建一个hellovelocity.vm模板文件,虽然很简单,但足以证明Velocity模板引擎是否正确安装,也足以显示出Velocity模板分离内容及其表现方式的一般过程。把下面这行代码加入hellovelocity.vm模板。
Hello $name, this is Velocity working!
保存hellovelocity.vm模板,然后再新建一个HelloVelocity.java文件,这两个文件最好放入同一目录下。下面是HelloVelocity.java的代码,它显示了在Java程序中调用Velocity模板引擎的一般过程。
import java.io.StringWriter;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
public class HelloVelocity
{
public static void main(String[] args) throws Exception
{ /* 首先创建一个模板引擎的实例,并予以初始化 */
VelocityEngine engine = new VelocityEngine(); engine.init();
/* 接着,获得一个模板 */
Template template = engine.getTemplate( "hellovelocity.vm" );
/* 创建上下文,填充数据 */
VelocityContext context = new VelocityContext();
context.put("name", "World");
/* 现在,把模板和数据合并,输出到StringWriter */
StringWriter writer = new StringWriter();
template.merge( context, writer );
/* 显示结果 */
System.out.println( writer.toString() );
}
}
准备好两个文件后,编译Java文件并运行。如果一切顺利的话,你可以看到下面的输出:
Hello World, this is Velocity working!
示例解析:
下面我们简单地分析一下这个例子。在模板文件中,唯一特别的部分是$name。$name是Velocity模板语言(VTL,Velocity Template Language)的一个变量,VTL利用这种方法将动态内容插入到静态文本之中。
在VTL中,所有变量标识符的开头要加上$字符,变量标识符被映射到稍后即将讨论的VelocityContext对象。在模板引擎处理模板时,变量名称(如name)被替换成VelocityContext中提供的值(如World)。顺便提一下,变量还可以用一种更加明确的方法表示,例如${name}。
当然,这只能算一个对VTL的极为简要、粗略的说明。实际上,VTL还有许多强大的功能,例如迭代列表、在模板内部创建变量,甚至还允许创建宏以实现自动化。
再来看看本例的Java代码。从上面的代码可以看出我们应该如何构造VelocityEngine对象并予以初始化,以及如何创建一个读取模板文件的Template对象。
完成这些准备工作后,我们接着创建一个VelocityContext对象,然后向这个对象插入数据。VelocityContext用一个HashMap来保存数据,这个HashMap的键总是来自模板的变量标识符,它的值可以是一个字符串,也可以是一个对象。后者充分显示出Velocity的强大功能,例如,假设有一个标识符为employee的Employee对象,且Employee对象有一个公用的getName方法,我们就可以在模板中以$employee.getName()的形式访问Employee对象内部的数据。
Employee对象可以通过访问数据库中的数据或其他办法创建,但Velocity根本不必了解这些细节,Velocity唯一关心的是要有一个创建好的Employee对象。相对于传统的JSP/PHP开发环境来说,Velocity的这一功能无疑带来很多方便。
很多人在Servlet框架下使用Velocity,但许多人发现,即使在其他环境下Velocity也很有用,Torque就是一个很好的例子。Torque是一个实现数据持久化的层,它能够根据XML配置文件自动生成SQL和Java代码,在生成代码的过程中,Torque要用到Velocity模板,从而实现了对多种不同数据库的支持。
另一个例子是Anakia,许多Jakarta项目用Anakia来创建文档。类似地,Anakia也要用到一个XML文件,它把XML文件和Velocity模板合并,从而得到最后的文档。这种处理方式方便了XML文件中的数据和模板文件中的显示方式的分离。
总地看来,Velocity非常适合于在现有代码项目的基础上改进应用的显示逻辑,因为对象的任何公用的方法都可以在VelocityContext中引用,从而可以在不修改现有的任何代码的前提下引入Velocity。模板和数据的分离方便了开发者和设计者的协作,使他们尽可能不依赖于对方。虽然你可以很快初步掌握Velocity模板语言,但就功能而言VTL并不寒酸,只要提供简单的模板,你就可以将数据以各种形式输出。