﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-JBOSS 点滴-随笔分类-Velocity</title><link>http://www.blogjava.net/fiele/category/47059.html</link><description>丰丰的博客</description><language>zh-cn</language><lastBuildDate>Tue, 16 Nov 2010 11:39:12 GMT</lastBuildDate><pubDate>Tue, 16 Nov 2010 11:39:12 GMT</pubDate><ttl>60</ttl><item><title>  Velocity语法(VM) </title><link>http://www.blogjava.net/fiele/archive/2010/11/16/338193.html</link><dc:creator>半导体</dc:creator><author>半导体</author><pubDate>Tue, 16 Nov 2010 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/fiele/archive/2010/11/16/338193.html</guid><wfw:comment>http://www.blogjava.net/fiele/comments/338193.html</wfw:comment><comments>http://www.blogjava.net/fiele/archive/2010/11/16/338193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fiele/comments/commentRss/338193.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fiele/services/trackbacks/338193.html</trackback:ping><description><![CDATA[<p>&nbsp; Velocity语法(VM)&nbsp;&nbsp;<br />
&nbsp; </p>
<p>1.&nbsp;&nbsp;&nbsp;&nbsp; 变量 </p>
<p>(1) 变量的定义 ： </p>
<p>#set($name = "hello")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说明：velocity中变量是弱类型的。 </p>
<p>当使用#set 指令时，括在双引号中的字面字符串将解析和重新解释，如下所示： </p>
<p>#set($directoryRoot = "www" ) </p>
<p>#set($templateName = "index.vm" ) </p>
<p>#set($template = "$directoryRoot/$templateName" ) </p>
<p>$template </p>
<p>输出将会是： www/index.vm </p>
<p>注： 在velocity中使用$2.5这样的货币标识是没有问题得的，因为velocity中的变量总是以一个大写或者小写的字母开始的。 </p>
<p>(2) 变量规范的写法 </p>
<p>${name} ，也可以写成：$name。提倡用前面的写法。 </p>
<p>例如：你希望通过一个变量$vice 来动态的组织一个字符串。 </p>
<p>&nbsp;Jack is a $vicemaniac. </p>
<p>本来变量是 $vice现在却变成了$vicemaniac，这样Veloctiy就不知道您到底要什么了。所以，应该使用规范的格式书写 ： Jack is a ${vice}maniac<br />
现在Velocity知道变量是$vice而不是$vicemaniac。 </p>
<p>注意：当引用属性的时候不能加{} </p>
<p>(3) 变量的赋值:&nbsp; </p>
<p>$name="hello" </p>
<p>赋值的左边必须是一个变量或者是属性引用。右边可以是下面六种类型之一： </p>
<p>变量引用,字面字符串,属性引用,方法引用,字面数字,数组列表。 </p>
<p>下面的例子演示了上述的每种类型： </p>
<p>#set( $monkey = $bill ) ## variable reference </p>
<p>#set( $monkey.Friend = "monica" ) ## string </p>
<p>#set( $monkey.Blame = $whitehouse.Leak ) ## property reference </p>
<p>#set( $monkey.Plan = $spindoctor.weave($web) ) ## method reference </p>
<p>#set( $monkey.Number = 123 ) ##number </p>
<p>#set( $monkey.Say = ["Not", $my, "fault"] ) ## ArrayList </p>
<p>注意： ①如果上述例子中的右值是null, 则左值不会被赋值，也就是说会保留以前的值。 </p>
<p>②velocity模板中未被定义的变量将被认为是一个字符串。例如： </p>
<p>#set($foo = "gibbous") <br />
$moon = $foo<br />
输出结果为：<br />
$moon = gibbous </p>
<p>③ velocity 模板中不会将 reference 解释为对象的实例变量。例如： $foo.Name 将被解释为 Foo 对象的 getName （）方法，而不是 Foo 对象的 Name 实例变量。例如： </p>
<p>$ foo.getBar()&nbsp; 等同于 $ foo.Bar ； </p>
<p>$ data.getUser("jon") 等同于 $ data.User("jon") ； </p>
<p>data.getRequest().getServerName() 等同于 </p>
<p>$ data.Request.ServerName 等同于 $ {data.Request.ServerName} </p>
<p>&nbsp; </p>
<p>2.&nbsp;&nbsp;&nbsp;&nbsp; 循环 </p>
<p>#foreach ($element in $list)<br />
&nbsp;&nbsp;&nbsp;&nbsp; This is $element.<br />
&nbsp;&nbsp;&nbsp;&nbsp; $velocityCount <br />
#end </p>
<p>例子： </p>
<p>#set( $list = ["pine", "oak", "maple"]) </p>
<p>#foreach ( $ element in&nbsp; $ list) </p>
<p>$velocityCount </p>
<p>This is&nbsp; $ element.&lt;br&gt;<br />
#end </p>
<p>输出的结果为： </p>
<p>1 This is pine. <br />
2 This is oak. <br />
3 This is maple. </p>
<p>每次循环 $list 中的一个值都会赋给 $element 变量。 <br />
$list 可以是一个 Vector、 Hashtable 或者 Array 。分配给 $element 的值是一个 java 对象，并且可以通过变量被引用。例如：如果 $element t 是一个 java 的 Product 类，并且这个产品的名字可以通过调用他的 getName（） 方法得到。 </p>
<p>#foreach ( $key in $list.keySet())<br />
Key: $key -&gt; Value: $list.get($key) &lt;br&gt;<br />
#end </p>
<p>提示 ：velocity中大小写敏感。 </p>
<p>Velocity还特别提供了得到循环次数的方法，$velocityCount变量的名字是Velocity默认的名字。 </p>
<p>&nbsp; </p>
<p>例子： </p>
<p>First example: <br />
&nbsp; #foreach ( $foo in [1..5] ) <br />
&nbsp;&nbsp;&nbsp; $foo <br />
&nbsp; #end </p>
<p>&nbsp; Second example: <br />
&nbsp; #foreach ( $bar in [2..-2] ) <br />
&nbsp;&nbsp;&nbsp; $bar <br />
&nbsp; #end </p>
<p>&nbsp; Third example: <br />
&nbsp; #set ( $arr = [0..1] ) <br />
&nbsp; #foreach ( $i in $arr ) <br />
&nbsp;&nbsp;&nbsp; $i <br />
&nbsp; #end <br />
上面三个例子的输出结果为： <br />
&nbsp; First example ： <br />
&nbsp; 1 2 3 4 5 </p>
<p>&nbsp; Second example ： <br />
&nbsp; 2 1 0 -1 -2 </p>
<p>&nbsp; Third example ： <br />
&nbsp; 0 1 </p>
<p>&nbsp;</p>
<p>3.&nbsp;&nbsp;&nbsp;&nbsp; 条件语句 </p>
<p>#if (condition) </p>
<p>#elseif (condition) </p>
<p>#else </p>
<p>#end </p>
<p>4.&nbsp;&nbsp;&nbsp;&nbsp; 语句的嵌套 </p>
<p>&nbsp;&nbsp;&nbsp; #foreach ($element in $list) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ## inner foreach 内循环 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #foreach ($element in $list) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This is $element. $velocityCount &lt; br &gt; inner &lt; br &gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #end </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ## inner foreach 内循环结束 </p>
<p>&nbsp;&nbsp;&nbsp; ## outer foreach </p>
<p>&nbsp;&nbsp;&nbsp; This is $element. </p>
<p>&nbsp;&nbsp;&nbsp; $velocityCount &lt; br &gt; outer &lt; br &gt; </p>
<p>&nbsp;&nbsp;&nbsp; #end </p>
<p>语句中也可以嵌套其他的语句，如#if&#8230;#else&#8230;#end等。 </p>
<p>5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注释 <br />
(1)单行注释：<br />
&nbsp; ## This is a single line comment.<br />
(2) 多行注释：<br />
&nbsp; #*<br />
&nbsp;&nbsp; Thus begins a multi-line comment. Online visitors won&#8217;t<br />
&nbsp;&nbsp; see this text because the Velocity Templating Engine will<br />
&nbsp; ignore it.<br />
&nbsp; *#<br />
(3)文档格式：<br />
&nbsp; #**<br />
&nbsp;&nbsp; This is a VTL comment block and<br />
&nbsp;&nbsp; may be used to store such information<br />
&nbsp; as the document author and versioning<br />
&nbsp;&nbsp; information:<br />
&nbsp;&nbsp; @version 1.1 </p>
<p>&nbsp;&nbsp; @author&nbsp; xiao<br />
&nbsp;&nbsp;&nbsp;&nbsp; *# </p>
<p>6.&nbsp;&nbsp;&nbsp;&nbsp; 关系和逻辑操作符 </p>
<p>Velocity 也具有逻辑AND, OR 和 NOT 操作符。 </p>
<p>如 </p>
<p>## example for AND </p>
<p>#if($foo &amp;&amp; $bar) </p>
<p>&nbsp;&nbsp; &lt;strong&gt; This AND that&lt;/strong&gt; </p>
<p>#end </p>
<p>例子中#if() 指令仅在$foo 和$bar 斗为真的时候才为真。如果$foo 为假，则表达式也为假；并且 $bar 将不被求值。如果 $foo 为真，Velocity 模板引擎将继续检查$bar的值，如果 $bar 为真，则整个表达式为真。并且输出This AND that 。如果 $bar 为假，将没有输出因为整个表达式为假。 </p>
<p>7.Velocity 中的宏 </p>
<p>Velocity中的 宏我们可以理解为函数。 </p>
<p>①宏的定义 </p>
<p>#macro(宏的名称 $参数1 $参数2 &#8230;) </p>
<p>&nbsp;&nbsp; 语句体(即函数体) </p>
<p>#end </p>
<p>②宏的调用 </p>
<p>#宏的名称($参数1 $参数2 &#8230;) </p>
<p>&nbsp;&nbsp;&nbsp; 说明：参数之间用空格隔开。 </p>
<p>8． #stop </p>
<p>&nbsp;&nbsp; 停止执行模板引擎并返回,把它应用于debug是很有帮助的。 </p>
<p>9．#include 与#parse </p>
<p>#include和#parse的作用 都是 引入本地文件, 为了安全的原因，被引入的本地文件只能在TEMPLATE_ROOT目录下。 </p>
<p>区别： </p>
<p>(1) 与#include不同的是，#parse只能指定单个对象。而#include可以有多个 </p>
<p>如果您需要引入多个文件，可以用逗号分隔就行： <br />
#include ( " one.gif " , " two.txt " , " three.htm " )<br />
在括号内可以是文件名，但是更多的时候是使用变量的：<br />
#include ( &#8220;greetings.txt&#8221;, $seasonalstock ) </p>
<p>(2) #include被引入文件的内容将不会通过模板引擎解析； </p>
<p>而#parse 引入的文件内容 Velocity 将解析其中的 velocity 语法并移交给模板，意思就是说相当与把引入的文件 copy 到文件中。 </p>
<p>#parse是可以递归调用的，例如：如果dofoo.vm包含如下行： </p>
<p>Count down.&lt;br&gt; </p>
<p>#set ($count = 8) </p>
<p>#parse ("parsefoo.vm") </p>
<p>&lt;br&gt;All done with dofoo.vm! </p>
<p>那么在parsefoo.vm模板中，你可以包含如下VTL： </p>
<p>$count </p>
<p>#set($count = $count - 1) </p>
<p>#if ( $count &gt; 0 )&lt;br&gt; </p>
<p>#parse( "parsefoo.vm" ) </p>
<p>#else </p>
<p>&lt;br&gt;All done with parsefoo.vm! </p>
<p>#end 的显示结果为： </p>
<p>Count down. </p>
<p>8 </p>
<p>7 </p>
<p>6 </p>
<p>5 </p>
<p>4 </p>
<p>3 </p>
<p>2 </p>
<p>1 </p>
<p>0 </p>
<p>All done with parsefoo.vm! </p>
<p>All done with dofoo.vm! </p>
<p>注意：在 vm中使用#parse来嵌套另外一个vm时的变量共享问题。如：<br />
-&gt;a.vm 里嵌套 b.vm；<br />
-&gt;a.vm 里定义了变量 $param；<br />
-&gt;b.vm 里可以直接使用$param，无任何限制。<br />
但需要特别注意的是，如果b.vm里同时定义有变量$param，则b.vm里将使用b.vm里定义的值。 </p>
<p>10．转义字符'\'的使用 </p>
<p>如果reference被定义，两个&#8217;\&#8217;意味着输出一个&#8217;\&#8217;，如果未被定义，刚按原样输出。如： </p>
<p>#set($email = "foo" ) </p>
<p>$email </p>
<p>\$email </p>
<p>\\$email </p>
<p>\\\$email </p>
<p>输出： </p>
<p>foo<br />
$email<br />
\foo<br />
\$email </p>
<p>如果 $email 未定义 </p>
<p>$email </p>
<p>\$email </p>
<p>\\$email </p>
<p>\\\$email </p>
<p>输出： </p>
<p>$email<br />
\$email<br />
\\$email<br />
\\$email </p>
<p>&nbsp; </p>
<p>11． 内置对象 <br />
Velocity内置了一些对象，在vm模版里可以直接调用，列举如下：<br />
$request、$response、$session，另外，模板内还可以使用 $msg内的消息工具访问 Struts 的国际化资源，达到简便实现国际化的方法。 </p>
<p>12. 数组访问 </p>
<p>对数组的访问在Velocity 中存在问题，因为Velocity只能访问对象的方法，而数组又是一个特殊的Array，所以虽然数组可以进行循环列举，但却不能定位访问特定位置的元素，如 strs[2]，数组对固定位置元素的访问调用了Array的反射方法get(Object array, int index)，而Velocity没能提供这样的访问，所以数组要么改成List等其他类容器的方式来包装，要么就通过公用Util类的方式来提供，传入数组对象和要访问的位置参数，从而达到返回所需值的目的。 </p>
<p>&nbsp; </p>
<p>&nbsp; </p>
<p>示例部分 </p>
<p>1．Hello world的示例代码： </p>
<p>(1)Velocity模板 (hello.html) </p>
<p>&lt;!DOCTYPE HTML PUBLIC "-//W 3C //DTD HTML 4.0 Transitional//EN"&gt; </p>
<p>&lt;HTML&gt; </p>
<p>&lt;HEAD&gt; </p>
<p>&lt;TITLE&gt; New Document &lt;/TITLE&gt; </p>
<p>&lt;/HEAD&gt; </p>
<p>&lt;BODY&gt; </p>
<p>&nbsp;&nbsp;&nbsp; hello,$name!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （注意：这里的name与VelocityTest.java中的名称要一致） </p>
<p>&lt;/BODY&gt; </p>
<p>&lt;/HTML&gt; </p>
<p>(2)将velocity模板的内容转换的类(VelocityTest.java) </p>
<p>import java.io.File; </p>
<p>import java.io.FileOutputStream; </p>
<p>import java.io.PrintWriter; </p>
<p>import java.io.Writer; </p>
<p>import org.apache.velocity.Template; </p>
<p>import org.apache.velocity.VelocityContext; </p>
<p>import org.apache.velocity.app.Velocity; </p>
<p>import org.apache.velocity.app.VelocityEngine; </p>
<p>&nbsp; </p>
<p>/** </p>
<p>&nbsp;* Velocity转换 </p>
<p>&nbsp;* @author </p>
<p>&nbsp;*/ </p>
<p>public class VelocityTest </p>
<p>{ </p>
<p>&nbsp;&nbsp;&nbsp; /** </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * 主函数 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * @param args </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; */ </p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) </p>
<p>&nbsp;{ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获取模板引擎 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VelocityEngine ve = new VelocityEngine(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //模板文件所在的路径 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String path = "D:/java/jproject/regedit/webroot";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置参数 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ve.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path); </p>
<p>//处理中文问题 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ve.setProperty(Velocity.INPUT_ENCODING,"GBK"); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ve.setProperty(Velocity.OUTPUT_ENCODING,"GBK"); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //初始化模板 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ve.init(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获取模板(hello.html) </p>
<p>Velocity 模板的名称 <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Template template = ve.getTemplate("hello.html");&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获取上下文 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VelocityContext root = new VelocityContext(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //把数据填入上下文 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root.put("name","world");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （注意：与上面的对应） </p>
<p>//输出路径 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Strint outpath = "e:/helloworld.html"; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Writer mywriter = new PrintWriter(new FileOutputStream( </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new File(outpath)));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; template.merge(root, mywriter); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mywriter.flush();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; } </p>
<p>} </p>
<p>(3)环境的搭建 </p>
<p>在lib目录内分别copy 进：velocity-1.4.jar，velocity-dept.jar; </p>
<p>下载地址：http://jakarta.apache.org/velocity/ </p>
<p>(4)运行后的结果如下： </p>
<p>&lt;!DOCTYPE HTML PUBLIC "-//W 3C //DTD HTML 4.0 Transitional//EN"&gt; </p>
<p>&lt;HTML&gt; </p>
<p>&lt;HEAD&gt; </p>
<p>&lt;TITLE&gt; New Document &lt;/TITLE&gt; </p>
<p>&lt;/HEAD&gt; </p>
<p>&lt;BODY&gt; </p>
<p>hello,world! </p>
<p>&lt;/BODY&gt; </p>
<p>&lt;/HTML&gt; </p>
<p>&nbsp; </p>
<p>2． Servlet和Velocity结合 示例 </p>
<p>(1)example.html </p>
<p>&nbsp; &lt;html&gt;<br />
&nbsp; &lt;head&gt;&lt;title&gt;Velocity&lt;/title&gt;&lt;/head&gt;<br />
&nbsp; &lt;body bgcolor="#ffffff"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;center&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;h2&gt;Welcom to Velocity!&lt;/h2&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;i&gt;Here's the list of people&lt;/i&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;table cellspacing="0" cellpadding="5" width="20%" &gt;<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td bgcolor="#eeeeee" align="center"&gt;<br />
&nbsp;&nbsp;&nbsp; Names：<br />
&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp; #foreach ($name in $theList)<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td bgcolor="#eeeeee" align="center"&gt;$name&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp; #end<br />
&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/center&gt;<br />
&nbsp; &lt;/body&gt;<br />
&lt;/html&gt; </p>
<p>(2)servlet </p>
<p>package com.koal.velocity; </p>
<p>&nbsp; </p>
<p>import java.io.IOException; </p>
<p>import java.io.FileNotFoundException; </p>
<p>import java.util.ArrayList; </p>
<p>import java.util.Properties; </p>
<p>import java.util.Vector; </p>
<p>import javax.servlet.ServletConfig; </p>
<p>import javax.servlet.http.HttpServletRequest; </p>
<p>import javax.servlet.http.HttpServletResponse; </p>
<p>import org.apache.velocity.Template; </p>
<p>import org.apache.velocity.context.Context; </p>
<p>import org.apache.velocity.servlet.VelocityServlet; </p>
<p>import org.apache.velocity.app.Velocity; </p>
<p>import org.apache.velocity.exception.ResourceNotFoundException; </p>
<p>import org.apache.velocity.exception.ParseErrorException; </p>
<p>&nbsp; </p>
<p>public class SampleServlet extends VelocityServlet&nbsp; </p>
<p>{ </p>
<p>&nbsp;&nbsp;&nbsp; /** </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp; 由VelocityServlet.init()调用， </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp; 在此找出模版的路径 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; */ </p>
<p>&nbsp;&nbsp;&nbsp; protected Properties loadConfiguration(ServletConfig config ) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws IOException, FileNotFoundException { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Properties p = new Properties(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //取得路径 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String path = config.getServletContext().getRealPath("/"); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (path == null) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(" SampleServlet.loadConfiguration() : unable to " </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "get the current webapp root.&nbsp; Using '/'. Please fix."); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path = "/"; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置路径 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.setProperty( Velocity.FILE_RESOURCE_LOADER_PATH, path); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return p; </p>
<p>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; /** </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp; Velocity主要的商业逻辑处理方法，由VelocityServlet自动调用 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp; @param ctx 模板上下文&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp; @return Template 模板信息 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; public Template handleRequest( HttpServletRequest request, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response, Context ctx ) </p>
<p>&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //主要在此设置演示用的数据，开发中在此调用相应的业务处理流程， </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //并设置返回到页面的数据 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //待展示的列表数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String p1 = "第一位：LiuDong";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String p2 = "第二位：Liang.xf";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Vector personList = new Vector();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //中文需要转换<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; personList.addElement(new String(p1.getBytes(), "ISO-8859-1") );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; personList.addElement(new String(p2.getBytes(), "ISO-8859-1") );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("数据转换异常："+e);&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置数据，供页面模版替换成显示的数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ctx.put("theList", personList );&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义模板&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Template outty = null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //取模板 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outty =&nbsp; getTemplate("example.html");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch( ParseErrorException pee ) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("SampleServlet: parse error for template " + pee); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch( ResourceNotFoundException rnfe ) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("SampleServlet: template not found " + rnfe); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch( Exception e ) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Error " + e); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return outty; </p>
<p>} </p>
<p>&nbsp; </p>
<p>(3)在web.xml中的配置： </p>
<p>&lt;web-app&gt; </p>
<p>&lt;servlet&gt;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;SampleServlet&lt;/servlet-name&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.koal. velocity .SampleServlet&lt;/servlet-class&gt; </p>
<p>&lt;/servlet&gt; </p>
<p>&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;SampleServlet&lt;/servlet-name&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/SampleServlet&lt;/url-pattern&gt; </p>
<p>&lt;/servlet-mapping&gt; </p>
<p>&lt;/web-app&gt; </p>
<p>&nbsp; </p>
<p>(4)环境的搭建 </p>
<p>在lib目录内分别 copy进：commons-collections.jar , velocity- 1.4.jar，velocity-dept.jar;<br />
&nbsp;&nbsp;&nbsp; Tomcat运行环境正常。<br />
&nbsp;&nbsp;&nbsp; 启动Tomcat，在IE上输入： http://localhost:8080/example ，页面显示数据列表： </p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/mmm123lmj/archive/2009/11/19/4833620.aspx</p>
<img src ="http://www.blogjava.net/fiele/aggbug/338193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fiele/" target="_blank">半导体</a> 2010-11-16 16:43 <a href="http://www.blogjava.net/fiele/archive/2010/11/16/338193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>