由struts衍生出的Velocity技术

来源:互联网 发布:mac usb是2.0还是3.0 编辑:程序博客网 时间:2024/06/06 09:01

今天在看Struts1和Struts2的区别中看到一篇文章中提到struts1的缺陷:只支持JSP作为表现层技术,不能与Velocity,FreeMarker等技术整合。那么其中的Velocity技术指的是什么呢,也没有了解过,上网继续查了资料,马下来,留作以后学习和参考。

Velocity是一种Java模版引擎技术,该项目由Apache提出,由另外一种引擎技术Webmacro引深而来。那什么是官方的Velocity定义呢?Apache对它的定义是:一种基于Java的模板引擎,但允许任何人使用简单而强大的模板语言来引用定义在Java代码中的对象。可以在http://jakarta.apache.org/velocity/index.html查找更多信息。

下面是一个简单的Velocity例子:

1、创建velocity模版(其实和html一样),文件名为:hellovelocity.vm

<html> <title>Hello Velocity</title> <body> Welcome  $name  to Javayou.com! today is  $date. </body></html>
2、创建java文件,HelloVelocity.java 

package com.fasttalk. velocity; 
import java.io.StringWriter; 
import java.util.*; 
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 {
//初始化并取得Velocity引擎
VelocityEngine ve = new VelocityEngine();
ve.init();
//取得velocity的模版 
Template t = ve.getTemplate("hellovelocity.vm"); 
//取得velocity的上下文context 
VelocityContext context = new VelocityContext();
//把数据填入上下文 
context.put("name", "Liang"); 
context.put("date", (new Date()).toString());
//为后面的展示,提前输入List数值 
List temp = new ArrayList();
temp.add("1"); 
temp.add("2"); 
context.put("list", temp); 
//输出流 

StringWriter writer = new StringWriter();
//转换输出 
t.merge(context, writer); 
System.out.println(writer.toString());

}

http://jakarta.apache.org/site/binindex.cgi上下载Velocity 1.4 zip
4、把1上的hellovelocity.vm copy到运行的当前目录下,运行结构如下:
<html> <title>Hello Velocity</title> <body> Welcome Liang to Javayou.com! today is Tue Dec 14 19:26:37 CST 2004. </body> </html>

以上是最简单的运行结果,怎么样,知道个大概吧,模版hellovelocity.vm里的2个定义变量$name和$date分别被context.put("name", "Liang")和context.put("date", (new Date()).toString())所设的值替代了。

由此看来业务流程处理包括业务结果基本在model这层全部解决,而view这一层基本只用使用简单的VTL(Velocity Template Language)来展示。这样,Jsp岂不是不用了么?是的,这样的使用模式有点象早前的CGI方式:)由Velocity自动输出代码,并且Velocity在这方面的能力也很强,Turbine里就采用了Velocity来产生很多代码。

在Velocity中,变量的定义都是使用“$”开头的,$作为Velocity的标识符。字母、数字、中划和下划线都可以作为Velocity的定义变量。

还需要注意的是Velocity特色的变量定义,如:$student.No、$student.Address,它有2层含义:

l         第1种是如果student是hashtable,则将从hashtable中提取key为No和Address的值,

l         另外第2种就是它有可能是调用方法,即上面2个变量将被转换为student.getNo()和student.getAddress()。

Velocity对在servlet中的java code返回的值有对象,还可以调用对象的方法,如$ student.getAddress()等等,在此就不一一举例和深入了。

上面的例子只是简单的举例,现在当然不少人已经不满足这样的例子了,实际的应用中我们还常常需要作些选择性展示和列举一些迭代数据,如List列表,当然Velocity(具体来说应该是VTL模版语言)也支持这项功能,此外还支持其他一些常用的展示,如模版内部的变量(如Jsp内的变量),还有强大一些的如创建宏以实现自动化



原创粉丝点击