现在更多的网站制作采用一种 MVC 模式,也就是将网站制作工作分工,分别为M(Model, 模型),V(View 视图),C(Controller 控制器). 这种职责的分工到底有什么好处呢,它简化了软件开发过程中所有相关人员的工作, 使得不同的部分的修改通常不会影响的其他部分的工作,比如,我修改了后台某些程序的算法,并不影响前台的页面显示,前台页面修改不影响后台程序的开发。这种分工合作比起 jsp 混淆代码逻辑和显示层的做法要好的多。 所以越来越多的国外程序员在不断提出替代 jsp 的方案,在众多方案中, 一种基于 java 模板引擎的技术脱颖而出,最为著名的是 Velocity 和 Webmacro 两种模板技术。 模板引擎的设计思想最早是有 webmacro 提出的, 后来应用在一个著名的搜索引擎 www.altavista.com 上, 这种思想渐渐被 Apache 开发小组所采用,并作为一个子项目被提出来,这就是现在的 Velocity。模板引擎与MVC中视图这一部分的关系更为密切。它是经常作为一种 jsp 的替代技术出现在国外的一些论坛上的。但是 Velocity 可以应用在任何需要格式化数据显示的 java 程序中。 那么 Velocity 到底是什么呢?它的官方解释是: 你可能因为下面几种原因而使用 Velocity: Velocity 的强大之处在于它严格的区分程序开发功能的职责划分。 它限制模板可能访问的对象(也就是后台程序允许它得到的对象)来实现这一点。这意味着,网页设计人员可以只把精力放在数据的显示部分(View 视图)而程序员则只要关注如何写好程序的控制层(Controller,控制器)和商业逻辑和数据管理(模型 Model), 这就是 MVC 开发模式。MVC 现在已经是广泛接受的一种开发模式,它简化了开发和日益复杂的应用和维护工作。 Velocity 最擅长做哪些方面的工作呢? 不过 Velocity 用的最多的还是在基于 Java servlet 的网页程序中作生成网页的引擎,以替代 JSP 等技术。 除了比较容易使用外, 它提供了强大的模板语言以显示和操作数据,但是不是生成数据,这点很重要, 因为这个工作应该是程序逻辑的部分。 Velocity 非常适合在 J2EE (Java 2 Platform, Enterprise Edition) 的网站开发中充当替代 jsp 做输出页面的技术工作,虽然 JSP 包含在 j2ee 的规范中,其实 j2ee 本身并不需要 jsp . Velocity 是如何工作的呢? 虽然大多 Velocity 的应用都是基于 Servlet 的网页制作。但是为了说明 Velocity 的使用,我决定采用更通用的 Java application 来说明它的工作原理。 似乎所有语言教学的开头都是采用 HelloWorld 来作为第一个程序的示例。这里也不例外。 任何 Velocity 的应用都包括两个方面: Hello $name! Welcome to $site world! 第二是 Java 程序部分: import java.io.StringWriter; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; 将两个文件放在同一个目录下,编译运行,结果是: Hello Eiffel Qiu! Welcome to http://www.eiffelqiu.com world 为了保证运行顺利,请从 Velocity 的网站 http://jakarta.apache.org/velocity/ 上下载 Velocity 的运行包,将其中的 Velocity Jar 包的路径放在系统的 Classpath 中,这样就可以编译和运行以上的程序了。 这个程序很简单,但是它能让你清楚的了解 Velocity 的基本工作原理。程序中其他部分基本上很固定,最主要的部分在以下代码 这里 Velocity 获取模板文件,得到模板引用 /* next, get the Template */ Template t = ve.getTemplate( "hellosite.vm" ); 这里,初始化环境,并将数据放入环境 /* create a context and add data */ 其他代码比较固定,但是也非常重要,但是对于每个应用来说写法都很相同: /* first, get and initialize an engine */ 这是用来将环境变量和输出部分结合。 StringWriter writer = new StringWriter(); t.merge( context, writer ); /* show the World */ System.out.println( writer.toString() ); 记住,这在将来的 servlet 应用中会有所区别,因为网页输出并不和命令行输出相同,如果用于网页输出,将并不通过 System.out 输出。这会在以后的教程中给大家解释的。 那让我来总结一下 Velocity 真正的工作原理 : 你会发现简单变量名通常无法满足网页制作显示数据的需要,比如我们经常会循环显示一些数据集,或者是根据一些数据的值来决定如何显示下一步的数据, Velocity 同样提供了循环,判断的简单语法以满足网页制作的需要。Velocity 提供了一个简单的模板语言以供前端网页制作人员使用,这个模板语言足够简单(大部分懂得 javascript 的人就可以很快掌握,其实它比 javascript 要简单的多),当然这种简单是刻意的,因为它不需要它什么都能做, View 层其实不应该包含更多的逻辑,Velocity 的简单模板语法可以满足你所有对页面显示逻辑的需要,这通常已经足够了,这里不会发生象 jsp 那样因为一个无限循环语句而毁掉系统的情况,jsp 能做很多事情,Sun 在制定 Jsp 1.0 标准的时候,没有及时的限定程序员在 jsp 插入代码逻辑,使得早期的jsp 代码更象是 php 代码,它虽然强大,但是对显示层逻辑来说,并不必要,而且会使 MVC 三层的逻辑结构发生混淆。 |