??xml version="1.0" encoding="utf-8" standalone="yes"?>
1. 变量
(1) 变量的定?Q?
#set($name = "hello") 说明Qvelocity中变量是q型的?
当?set 指oӞ括在双引号中的字面字W串解析和重新解释Q如下所C:
#set($directoryRoot = "www" )
#set($templateName = "index.vm" )
#set($template = "$directoryRoot/$templateName" )
$template
输出会是: www/index.vm
注: 在velocity中?2.5q样的货币标识是没有问题得的Q因为velocity中的变量L以一个大写或者小写的字母开始的?
(2) 变量规范的写?
${name} Q也可以写成Q?name。提倡用前面的写法?
例如Q你希望通过一个变?vice 来动态的l织一个字W串?
Jack is a $vicemaniac.
本来变量?$vice现在却变成了$vicemaniacQ这样Veloctiy׃知道您到底要什么了。所以,应该使用规范的格式书?Q?Jack is a ${vice}maniac
现在Velocity知道变量?vice而不?vicemaniac?
注意Q当引用属性的时候不能加{}
(3) 变量的赋?
$name="hello"
赋值的左边必须是一个变量或者是属性引用。右边可以是下面六种cd之一Q?
变量引用,字面字符?属性引?Ҏ引用,字面数字,数组列表?
下面的例子演CZ上述的每U类型:
#set( $monkey = $bill ) ## variable reference
#set( $monkey.Friend = "monica" ) ## string
#set( $monkey.Blame = $whitehouse.Leak ) ## property reference
#set( $monkey.Plan = $spindoctor.weave($web) ) ## method reference
#set( $monkey.Number = 123 ) ##number
#set( $monkey.Say = ["Not", $my, "fault"] ) ## ArrayList
注意Q?①如果上qC子中的右值是null, 则左g会被赋|也就是说会保留以前的倹{?
②velocity模板中未被定义的变量被认ؓ是一个字W串。例如:
#set($foo = "gibbous")
$moon = $foo
输出l果为:
$moon = gibbous
?velocity 模板中不会将 reference 解释为对象的实例变量。例如: $foo.Name 被解释?Foo 对象?getName Q)ҎQ而不?Foo 对象?Name 实例变量。例如:
$ foo.getBar() {同?$ foo.Bar Q?
$ data.getUser("jon") {同?$ data.User("jon") Q?
data.getRequest().getServerName() {同?
$ data.Request.ServerName {同?$ {data.Request.ServerName}
2. 循环
#foreach ($element in $list)
This is $element.
$velocityCount
#end
例子Q?
#set( $list = ["pine", "oak", "maple"])
#foreach ( $ element in $ list)
$velocityCount
This is $ element.<br>
#end
输出的结果ؓQ?
1 This is pine.
2 This is oak.
3 This is maple.
每次循环 $list 中的一个值都会赋l?$element 变量?
$list 可以是一?Vector?Hashtable 或?Array 。分配给 $element 的值是一?java 对象Qƈ且可以通过变量被引用。例如:如果 $element t 是一?java ?Product c,q且q个产品的名字可以通过调用他的 getNameQ) Ҏ得到?
#foreach ( $key in $list.keySet())
Key: $key -> Value: $list.get($key) <br>
#end
提示 Qvelocity中大写敏感?
Velocityq特别提供了得到循环ơ数的方法,$velocityCount变量的名字是Velocity默认的名字?
例子Q?
First example:
#foreach ( $foo in [1..5] )
$foo
#end
Second example:
#foreach ( $bar in [2..-2] )
$bar
#end
Third example:
#set ( $arr = [0..1] )
#foreach ( $i in $arr )
$i
#end
上面三个例子的输出结果ؓQ?
First example Q?
1 2 3 4 5
Second example Q?
2 1 0 -1 -2
Third example Q?
0 1
3. 条g语句
#if (condition)
#elseif (condition)
#else
#end
4. 语句的嵌?
#foreach ($element in $list)
## inner foreach 内@?
#foreach ($element in $list)
This is $element. $velocityCount < br > inner < br >
#end
## inner foreach 内@环结?
## outer foreach
This is $element.
$velocityCount < br > outer < br >
#end
语句中也可以嵌套其他的语句,?if…#else…#end{?
5. 注释
(1)单行注释Q?br />
## This is a single line comment.
(2) 多行注释Q?br />
#*
Thus begins a multi-line comment. Online visitors won’t
see this text because the Velocity Templating Engine will
ignore it.
*#
(3)文档格式Q?br />
#**
This is a VTL comment block and
may be used to store such information
as the document author and versioning
information:
@version 1.1
@author xiao
*#
6. 关系和逻辑操作W?
Velocity 也具有逻辑AND, OR ?NOT 操作W?
?
## example for AND
#if($foo && $bar)
<strong> This AND that</strong>
#end
例子?if() 指o仅在$foo ?bar 斗ؓ真的时候才为真。如?foo 为假Q则表达式也为假Qƈ?$bar 不被求倹{如?$foo 为真QVelocity 模板引擎l检?bar的|如果 $bar 为真Q则整个表达式ؓ真。ƈ且输出This AND that 。如?$bar 为假Q将没有输出因ؓ整个表达式ؓ假?
7.Velocity 中的?
Velocity中的 宏我们可以理解ؓ函数?
①宏的定?
#macro(宏的名称 $参数1 $参数2 …)
语句?卛_C)
#end
②宏的调?
#宏的名称($参数1 $参数2 …)
说明Q参C间用I格隔开?
8Q?#stop
停止执行模板引擎q返?把它应用于debug是很有帮助的?
9Q?include ?parse
#include?parse的作?都是 引入本地文g, Z安全的原因,被引入的本地文g只能在TEMPLATE_ROOT目录下?
区别Q?
(1) ?include不同的是Q?parse只能指定单个对象。?include可以有多?
如果您需要引入多个文Ӟ可以用逗号分隔pQ?
#include ( " one.gif " , " two.txt " , " three.htm " )
在括号内可以是文件名Q但是更多的时候是使用变量的:
#include ( “greetings.txt”, $seasonalstock )
(2) #include被引入文件的内容不会通过模板引擎解析Q?
?parse 引入的文件内?Velocity 解析其中的 velocity 语法q移交给模板Q意思就是说相当与把引入的文?copy 到文件中?
#parse是可以递归调用的,例如Q如果dofoo.vm包含如下行:
Count down.<br>
#set ($count = 8)
#parse ("parsefoo.vm")
<br>All done with dofoo.vm!
那么在parsefoo.vm模板中,你可以包含如下VTLQ?
$count
#set($count = $count - 1)
#if ( $count > 0 )<br>
#parse( "parsefoo.vm" )
#else
<br>All done with parsefoo.vm!
#end 的显C结果ؓQ?
Count down.
8
7
6
5
4
3
2
1
0
All done with parsefoo.vm!
All done with dofoo.vm!
注意Q在 vm中?parse来嵌套另外一个vm时的变量׃n问题。如Q?br /> ->a.vm 里嵌?b.vmQ?br /> ->a.vm 里定义了变量 $paramQ?br /> ->b.vm 里可以直接?paramQ无M限制?br /> 但需要特别注意的是,如果b.vm里同时定义有变量$paramQ则b.vm里将使用b.vm里定义的倹{?
10Q{义字W?\'的?
如果reference被定义,两个’\’意味着输出一?#8217;\’Q如果未被定义,刚按原样输出。如Q?
#set($email = "foo" )
输出Q?
foo
$email
\foo
\$email
如果 $email 未定?
输出Q?
$email
\$email
\\$email
\\$email
11Q?内置对象
Velocity内置了一些对象,在vm模版里可以直接调用,列D如下Q?br />
$request?response?sessionQ另外,模板内还可以使用 $msg内的消息工具讉K Struts 的国际化资源Q达到简便实现国际化的方法?
12. 数组讉K
Ҏl的讉K在Velocity 中存在问题,因ؓVelocity只能讉K对象的方法,而数l又是一个特D的ArrayQ所以虽然数l可以进行@环列举,但却不能定位讉K特定位置的元素,?strs[2]Q数l对固定位置元素的访问调用了Array的反方法get(Object array, int index)Q而Velocity没能提供q样的访问,所以数l要么改成List{其他类容器的方式来包装Q要么就通过公用Utilcȝ方式来提供,传入数组对象和要讉K的位|参敎ͼ从而达到返回所需值的目的?
CZ部分
1QHello world的示例代码:
(1)Velocity模板 (hello.html)
<!DOCTYPE HTML PUBLIC "-//W 3C //DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
</HEAD>
<BODY>
hello,$name! Q注意:q里的name与VelocityTest.java中的名称要一_
</BODY>
</HTML>
(2)velocity模板的内容{换的c?VelocityTest.java)
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.io.Writer;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
/**
* Velocity转换
* @author
*/
public class VelocityTest
{
/**
* d?
* @param args
*/
public static void main(String[] args)
{
//获取模板引擎
VelocityEngine ve = new VelocityEngine();
//模板文g所在的路径
String path = "D:/java/jproject/regedit/webroot";
//讄参数
ve.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path);
//处理中文问题
ve.setProperty(Velocity.INPUT_ENCODING,"GBK");
ve.setProperty(Velocity.OUTPUT_ENCODING,"GBK");
try
{
//初始化模?
ve.init();
//获取模板(hello.html)
Velocity 模板的名U?
Template template = ve.getTemplate("hello.html");
//获取上下?
VelocityContext root = new VelocityContext();
//把数据填入上下文
root.put("name","world"); Q注意:与上面的对应Q?
//输出路径
Strint outpath = "e:/helloworld.html";
//输出
Writer mywriter = new PrintWriter(new FileOutputStream(
new File(outpath)));
template.merge(root, mywriter);
mywriter.flush();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
(3)环境的搭?
在lib目录内分别copy q:velocity-1.4.jarQvelocity-dept.jar;
下蝲地址Qhttp://jakarta.apache.org/velocity/
(4)q行后的l果如下Q?
<!DOCTYPE HTML PUBLIC "-//W 3C //DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
</HEAD>
<BODY>
hello,world!
</BODY>
</HTML>
2Q?Servlet和Velocityl合 CZ
(1)example.html
<html>
<head><title>Velocity</title></head>
<body bgcolor="#ffffff">
<center>
<h2>Welcom to Velocity!</h2>
<i>Here's the list of people</i>
<table cellspacing="0" cellpadding="5" width="20%" >
<tr>
<td bgcolor="#eeeeee" align="center">
NamesQ?br />
</td>
</tr>
#foreach ($name in $theList)
<tr>
<td bgcolor="#eeeeee" align="center">$name</td>
</tr>
#end
</table>
</center>
</body>
</html>
(2)servlet
package com.koal.velocity;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Properties;
import java.util.Vector;
import javax.servlet.ServletConfig;
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.servlet.VelocityServlet;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.exception.ParseErrorException;
public class SampleServlet extends VelocityServlet
{
/**
* 由VelocityServlet.init()调用Q?
* 在此扑և模版的\?
*/
protected Properties loadConfiguration(ServletConfig config )
throws IOException, FileNotFoundException {
Properties p = new Properties();
//取得路径
String path = config.getServletContext().getRealPath("/");
if (path == null)
{
System.out.println(" SampleServlet.loadConfiguration() : unable to "
+ "get the current webapp root. Using '/'. Please fix.");
path = "/";
}
//讄路径
p.setProperty( Velocity.FILE_RESOURCE_LOADER_PATH, path);
return p;
}
/**
* Velocity主要的商业逻辑处理ҎQ由VelocityServlet自动调用
* @param ctx 模板上下?nbsp;
* @return Template 模板信息
*/
public Template handleRequest( HttpServletRequest request,
HttpServletResponse response, Context ctx )
{
//主要在此讄演示用的数据Q开发中在此调用相应的业务处理流E,
//q设|返回到面的数?
//待展C的列表数据
String p1 = "W一位:LiuDong";
String p2 = "W二位:Liang.xf";
Vector personList = new Vector();
//中文需要{?br />
try {
personList.addElement(new String(p1.getBytes(), "ISO-8859-1") );
personList.addElement(new String(p2.getBytes(), "ISO-8859-1") );
} catch (Exception e) {
System.out.println("数据转换异常Q?+e);
}
//讄数据Q供面模版替换成显C的数据
ctx.put("theList", personList );
//定义模板
Template outty = null;
try
{
//取模?
outty = getTemplate("example.html");
}
catch( ParseErrorException pee )
{
System.out.println("SampleServlet: parse error for template " + pee);
}
catch( ResourceNotFoundException rnfe )
{
System.out.println("SampleServlet: template not found " + rnfe);
}
catch( Exception e )
{
System.out.println("Error " + e);
}
return outty;
}
(3)在web.xml中的配置Q?
<web-app>
<servlet>
<servlet-name>SampleServlet</servlet-name>
<servlet-class>com.koal. velocity .SampleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SampleServlet</servlet-name>
<url-pattern>/SampleServlet</url-pattern>
</servlet-mapping>
</web-app>
(4)环境的搭?
在lib目录内分?copyq:commons-collections.jar , velocity- 1.4.jarQvelocity-dept.jar;
Tomcatq行环境正常?br />
启动TomcatQ在IE上输入: http://localhost:8080/example Q页面显C数据列表:
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/mmm123lmj/archive/2009/11/19/4833620.aspx