Velocity是Apache软件组织提供的一想开源源码项目,可前往Apache Velocity Project下载。它是基于Java的模板引擎,主要用于简化Web应用开发。网页设计者可以通过Velocity模板语言定义模板,开发者编写程序代码设置上下文,Velocity引擎负责结合模板和上下文,以此生成动态网页。很明显,Velocity可将Java代码从Web页面中分离出来,是Web站点在长时间运行后仍然有很好的维护性。视图VTL模板语言不用经过JSP编译器的编译,VTL模板的解析是由Velocity引擎来完成的。特别需要注意的是,若扩展VelocityServlet,将被提示the type VelocityServlet is deprecated,如下图所示:
。API文档中写道,This servlet has been replaced by VelocityViewServlet, available from the Velocity-Tools sub-project. VelocityViewServlet provides support for quick, clean MVC web development. VelocityServlet will be removed in a future version of Velocity.于是,我去扩展VelocityViewServlet,引用的时候,发现
,顿时感觉Velocity API文档在逗我。我进入VelocityViewServlet源码中发现,原来注释中有告诉我们,已经被移动到org.apache.velocity.tools.view.VelocityViewServlet中,部分源码如下图所示:
Velocity实例1
新建文件myvelocity.vm,具体内容如下:
##author: DJM
#set($jianming="king")
Welcome $djm to Velocity!
Today is $date.
djm is $jianming.
创建简单的类MyVelocity,代码如下:
package com.jianming;
import java.io.StringWriter;
import java.util.Date;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
public class MyVelocity {
public static void main(String[] args) {
// 初始化并取得Velocity引擎
VelocityEngine ve = new VelocityEngine();
ve.init();
// 取得velocity的模版
Template template = ve.getTemplate("src/com/jianming/myvelocity.vm");
// 取得velocity的上下文context
VelocityContext context = new VelocityContext();
context.put("djm", "DengJianming");
context.put("date", new Date());
StringWriter sw = new StringWriter();
template.merge(context, sw);
System.out.println(sw.toString());
}
}
运行之后的结果如下图所示:
Velocity实例2
在WEB-INF目录下创建属性文件velocity.properties和vm目录,并在vm目录中创建模板文件myvelocity.vm和。
velocity.properties文件的内容为:
resource.loader = webapp
webapp.resource.loader.class = org.apache.velocity.tools.view.servlet.WebappLoader
webapp.resource.loader.path=/WEB-INF/vm/
input.encoding=utf-8
output.encoding=utf-8
myvelocity.vm文件的内容为:
##author: DJM
<html>
<head>
<title>$djm</title>
</head>
<body bgcolor="#ffffff">
<h2>$djm</h2><hr>
#set($jianming="king")
Welcome $djm to Velocity!<hr>
Today is <font color="#E10300">$date.</font><hr>
djm is $jianming.<hr>
</body>
</html>
编写MyVelocity类,源码如下:
package com.threeeyes.djm;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.velocity.Template;
import org.apache.velocity.context.Context;
import org.apache.velocity.tools.view.VelocityViewServlet;
public class MyVelocity extends VelocityViewServlet {
private static final long serialVersionUID = 8439995475770991915L;
@Override
protected Template handleRequest(HttpServletRequest request,
HttpServletResponse response, Context ctx) {
ctx.put("djm", "ZhaoXue");
ctx.put("date", new Date());
return getTemplate("myvelocity.vm");
}
@Override
protected void setContentType(HttpServletRequest request,
HttpServletResponse response) {
response.setContentType("text/html; charset=utf-8");
}
}
在web.xml文件中添加如下配置:
<servlet>
<servlet-name>myVelocity</servlet-name>
<servlet-class>com.threeeyes.djm.MyVelocity</servlet-class>
<init-param>
<param-name>org.apache.velocity.properties</param-name>
<param-value>/WEB-INF/velocity.properties</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>myVelocity</servlet-name>
<url-pattern>/myVelocity</url-pattern>
</servlet-mapping>
部署到tomcat之后,运行程序显示结果如下:
Velocity注释
VTL中,单行注释采用"##",对于多行注释采用"#*"和"*#"符号。
Velocity指令
#set指令
#set指令用来为引用变量或者引用属性赋值,比如:
#set($djm="dengjianming")
赋值表达式的左边必须是一个变量引用或者属性引用,右边可以是变量引用($djm)、字符串("zhaoxue")、属性引用($MyWife.name)、方法引用($djm.merge($condition))、数字(200)、数组({"deng", "jian", "ming"})、简单的算术表达式。
字面字符串
当使用#set指令时,在双引号中的字面字符串将被解析。在单引号中的字面字符串将不被解析。
#if指令
当#if指令的IF条件为真时,Velocity将输出#if代码块包含的文本,比如,
#if($flag)
<h1>少说话,多生娃</h1>
#end
当$flag是一个逻辑类型为true的变量或者$flag值为非空的情况下,if才为真。当$flag是一个逻辑类型为flase的变量或者$flag的值为null,if才为假。
在#if语句后可包含#elseif和#else项。