由struts衍生出的Velocity技术

今天在看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内的变量),还有强大一些的如创建宏以实现自动化



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值