《Velocitystudy》由会员分享,可在线阅读,更多相关《Velocitystudy(32页珍藏版)》请在金锄头文库上搜索。
1、Velocity開発概要内容n nWhat is Velocity?What is Velocity?What is Velocity?What is Velocity? n nWhy we need Velocity?Why we need Velocity?Why we need Velocity?Why we need Velocity? n nWhat can Velocity do for us?What can Velocity do for us?What can Velocity do for us?What can Velocity do for us?n nHow How
2、How How VelocityVelocityVelocityVelocity work work work works s s s? ? ? ?n nVTL(Velocity Template Language)VTL(Velocity Template Language)VTL(Velocity Template Language)VTL(Velocity Template Language)介介介介绍绍 n nVelocityVelocityVelocityVelocity应应用用用用2024/7/252024/7/25What is Velocity? 官方解释官方解释 :Veloc
3、ityVelocity是一种基于是一种基于 javajava的模板引擎,允许任何人使的模板引擎,允许任何人使用简单而强大的模板语言来引用定义在用简单而强大的模板语言来引用定义在 javajava代码中的对象代码中的对象。 2024/7/252024/7/25它很容易集成在各种各样的程序领域中。它很容易集成在各种各样的程序领域中。它为网页制作人员提供了一种清晰而又简单的语法它为网页制作人员提供了一种清晰而又简单的语法。因为模板和代码是分离的,所以你可以分别独立的开发因为模板和代码是分离的,所以你可以分别独立的开发和维护它们。和维护它们。VelocityVelocity引擎可以很容易的集成到一些引
4、擎可以很容易的集成到一些 JavaJava运行环境,运行环境,特别是特别是 ServletServlet。VelocityVelocity使得模板可以访问任何环境对象中的共有方法。使得模板可以访问任何环境对象中的共有方法。 Why we need Velocity?Velocity is light, fast, and versatile ,can works well with others ,and besides, Velocity is simple but powerful 2024/7/252024/7/25 Velocity的强大之处在于它严格的区分程序开发功能的职责划分在服务
5、器端可以使用在服务器端可以使用VelocityVelocity处理模板和生成的动态内容(处理模板和生成的动态内容(HTMLHTML、XMLXML等)。这和等)。这和JSPJSP技术的目标非常接近。但是,技术的目标非常接近。但是,JSPJSP模型可以毫无阻碍模型可以毫无阻碍地访问底层的地访问底层的ServletServletAPIAPI和和JavaJava编程语言。事实上,为了避免访问这些编程语言。事实上,为了避免访问这些固有的特性,您在编码中必须严格约束(只是使用固有的特性,您在编码中必须严格约束(只是使用 ELEL、标签库和类似的、标签库和类似的特性)。它基本上是一种在很大程度上开放的访问模
6、型。特性)。它基本上是一种在很大程度上开放的访问模型。拿拿VelocityVelocity与之比较。作为一种完全自包含的模板引擎和脚本解释器,与之比较。作为一种完全自包含的模板引擎和脚本解释器,VelocityVelocity拥有完全封闭的模型。任何针对系统和拥有完全封闭的模型。任何针对系统和/ /或或JavaJava编程语言的访问编程语言的访问都必须明确地启用。默认情况,都必须明确地启用。默认情况,VelocityVelocity模板中不能访问模板中不能访问JavaJava编程语言的编程语言的任何方面。这种封闭的模型使任何方面。这种封闭的模型使VelocityVelocity能够提供分离的模
7、板表示层,与任能够提供分离的模板表示层,与任何应用程序业务逻辑或者数据管理代码清晰地划分开。何应用程序业务逻辑或者数据管理代码清晰地划分开。Why we need Velocity?2024/7/252024/7/25What can Velocity do for us? 基于基于 servletservlet 的网站制作的网站制作JavaJava和和 SqlSql 代码生成代码生成XMLXML处理和转换处理和转换 文字处理,比如生成文字处理,比如生成 TRFTRF文件文件 不过不过, VelocityVelocity用的最多的还是在基于用的最多的还是在基于 JavaJavaservlets
8、ervlet 的网的网页程序中作页程序中作为为生成网页的引擎,以替代生成网页的引擎,以替代 JSPJSP等技术。等技术。 除了比除了比较容易使用外,较容易使用外, 它提供了强大的模板语言以显示和操作数据,它提供了强大的模板语言以显示和操作数据,但不是生成数据,这点很重要,但不是生成数据,这点很重要, 因为这个工作应该是程序逻因为这个工作应该是程序逻辑的部分。辑的部分。 2024/7/252024/7/25VelocityVelocity提供了一个简单的提供了一个简单的VelocityVelocity模板语言模板语言(VTL)(VTL)以供前端网页设计人员使用,这个模板语言足够简单,任以供前端网
9、页设计人员使用,这个模板语言足够简单,任何具有编程背景的人都可以非常快地学会何具有编程背景的人都可以非常快地学会 VTLVTL。 VTL VTL中的引用是一个命名元素,如中的引用是一个命名元素,如$ $parameterValueparameterValue。引用可以在引用可以在 Velocity Velocity 模板中作为占位符。在模板合并过模板中作为占位符。在模板合并过程中,这些占位符将被替换成相应的文本值,实现动态赋程中,这些占位符将被替换成相应的文本值,实现动态赋值,形成最终的输出。值,形成最终的输出。 下面我们以一个独立的下面我们以一个独立的javajava应用程序例子先来感受一应
10、用程序例子先来感受一下下VelocityVelocity的工作流程:的工作流程:How Velocity works?2024/7/252024/7/25How Velocity works?一个一个Velocity 的应用应该包括两个方面的应用应该包括两个方面:n n第一:第一:第一:第一: 模板制作模板制作模板制作模板制作,在这个例子中就是在这个例子中就是 hellovelocity.vmhellovelocity.vm: :HelloHello$user$user!Welcometo!Welcometo$name$namesworld!sworld!事实上你可以不包括任何事实上你可以不包
11、括任何HTMLHTML标签,也可以写得复杂些。标签,也可以写得复杂些。2024/7/252024/7/25How Velocity works?n n第二第二第二第二 Java Java 程序编写:程序编写:程序编写:程序编写: packagepackagecom.cyberobject.studycom.cyberobject.study; ;importimportjava.io.StringWriterjava.io.StringWriter; ;importimportorg.apache.velocity.app.VelocityEngineorg.apache.velocity.a
12、pp.VelocityEngine; ;importimportorg.apache.velocity.Templateorg.apache.velocity.Template; ;importimportorg.apache.velocity.VelocityContextorg.apache.velocity.VelocityContext; ; publicclasspublicclassHelloVelocityHelloVelocity publicstaticvoidpublicstaticvoidmain(Stringmain(Stringargsargs)throwsExcep
13、tion)throwsException /*/*获得并初始化一个模板引擎获得并初始化一个模板引擎*/ /VelocityEngineVelocityEngine veve=new=newVelocityEngineVelocityEngine();();ve.initve.init();(); /*/*以模板文件名为参数,调用以模板文件名为参数,调用getTemplategetTemplate()()得到一个模板对象得到一个模板对象*/ /Templatet=Templatet=ve.getTemplate(hellovelocity.vmve.getTemplate(helloveloci
14、ty.vm);); /*/*创建一个上下文环境对象,并将模板数据放入上下文环境中创建一个上下文环境对象,并将模板数据放入上下文环境中*/ /VelocityContextVelocityContextcontext=newcontext=newVelocityContextVelocityContext();();context.put(usercontext.put(user,“Linkage);,“Linkage);context.put(namecontext.put(name,Velocity);,Velocity);2024/7/252024/7/25How Velocity wor
15、ks?/*/*合并(合并(mergemerge)模板和数据并产生一个输出)模板和数据并产生一个输出*/ /StringWriterStringWriterwriter=newwriter=newStringWriterStringWriter();();t.merge(contextt.merge(context,writer);,writer); /*/*显示输出显示输出*/ /System.out.println(writer.toStringSystem.out.println(writer.toString();(); 编译和运行注意事项:编译和运行注意事项:编译和运行注意事项:编译和
16、运行注意事项:1 1 1 1、下载、下载、下载、下载VelocityVelocityVelocityVelocity解压,将解压,将解压,将解压,将velocity-dep-1.4.jarvelocity-dep-1.4.jarvelocity-dep-1.4.jarvelocity-dep-1.4.jar包放到您的包放到您的包放到您的包放到您的CLASSPATHCLASSPATHCLASSPATHCLASSPATH2 2 2 2、模板文件的放置位置:、模板文件的放置位置:、模板文件的放置位置:、模板文件的放置位置:如果您使用如果您使用如果您使用如果您使用IDEIDEIDEIDE运行本例,请将
17、运行本例,请将运行本例,请将运行本例,请将hellovelocity.vmhellovelocity.vmhellovelocity.vmhellovelocity.vm放到您的项目根目录;放到您的项目根目录;放到您的项目根目录;放到您的项目根目录;如果您在命令行下运行,请将如果您在命令行下运行,请将如果您在命令行下运行,请将如果您在命令行下运行,请将hellovelocity.vmhellovelocity.vmhellovelocity.vmhellovelocity.vm放到和放到和放到和放到和HelloVelocity.classHelloVelocity.classHelloVelo
18、city.classHelloVelocity.class文件的包平行的目录下。文件的包平行的目录下。文件的包平行的目录下。文件的包平行的目录下。 2024/7/252024/7/25在在eclipseeclipse上运行结果如下:上运行结果如下:How Velocity works?2024/7/252024/7/25在基于在基于WEB的应用中,通常大多数情况下是在的应用中,通常大多数情况下是在servlet里使用里使用Velocity。在在servlet里的里的Velocity基本应用是非常简单的,只需通过两个必要步骤就基本应用是非常简单的,只需通过两个必要步骤就可以实现:可以实现:一、继
19、承一、继承org.apache.velocity.servlet.VelocityServlet抽象类:抽象类:publicclassSampleServletextendsVelocityServlet二、二、仅需实现仅需实现VelocityServlet类的一个方法类的一个方法handleRequest():publicTemplatehandleRequest(HttpServletRequestreq,HttpServletResponseresp,Contextcontext)下面是例子(也是Velocity发行包自带的例子):How Velocity works? 基于基于WEB的
20、应用的应用 2024/7/252024/7/25一、准备工作一、准备工作本例按如下结构建立一个web应用:VelDemo|_log|_templates|_sample.vm|_WEB_INF|_classes|_your_full_path_servlet.class|_velocity.properties|_lib|_velocity-dep-1.4.jar|_web.xml这里我们使用了velocity.properties配置文件,通过这个文件我们可以灵活地进行一些运行期的配置,本例中,我们指定了模板文件和日志文件的位置。How Velocity works? 基于基于WEB的应用的
21、应用 2024/7/252024/7/25二、二、servlet类及相关文件编写类及相关文件编写 1、Velocity配置文件配置文件velocity.properties:#指定模板文件存放目录file.resource.loader.path=templates#指定日志文件位置runtime.log=log/velocity.log注意注意:键的名字即key是固定的,具体请参考veloctiy开发指南开发指南。2、模板文件模板文件sample.vm:SamplevelocitypageHello,welcometovelocitysworld!HeresthelistofpeopleHo
22、w Velocity works? 基于基于WEB的应用的应用 2024/7/252024/7/25Names#foreach($namein$theList)$name#end3、servlet类类SampleServlet.java:packagecom.cyberobject.study.velocity.servlet;importjava.io.IOException;importjava.io.FileNotFoundException;importjava.io.FileInputStream;How Velocity works? 基于基于WEB的应用的应用 2024/7/25
23、2024/7/25importjava.util.Properties;importjava.util.Vector;importjavax.servlet.ServletConfig;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.velocity.Template;importorg.apache.velocity.context.Context;importorg.apache.velocity.servlet.Velocit
24、yServlet;importorg.apache.velocity.app.Velocity;importorg.apache.velocity.exception.ResourceNotFoundException;importorg.apache.velocity.exception.ParseErrorException;publicclassSampleServletextendsVelocityServletprotectedPropertiesloadConfiguration(ServletConfigconfig)throwsIOException,FileNotFoundE
25、xceptionHow Velocity works? 基于基于WEB的应用的应用 2024/7/252024/7/25/*得到属性配置文件并load它*/StringpropsFile=config.getInitParameter(INIT_PROPS_KEY);Propertiesp=newProperties();if(propsFile!=null)StringrealPath=getServletContext().getRealPath(propsFile);if(realPath!=null)propsFile=realPath;p.load(newFileInputStrea
26、m(propsFile);/*设置velocity日志文件在web应用中的位置*/Stringlog=p.getProperty(Velocity.RUNTIME_LOG);if(log!=null)log=getServletContext().getRealPath(log);if(log!=null)p.setProperty(Velocity.RUNTIME_LOG,log);How Velocity works? 基于基于WEB的应用的应用 2024/7/252024/7/25/*设置模板文件在web应用中的位置*/Stringpath=p.getProperty(Velocity.
27、FILE_RESOURCE_LOADER_PATH);if(path!=null)path=getServletContext().getRealPath(path);if(path!=null)p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH,path);returnp;publicTemplatehandleRequest(HttpServletRequestrequest,HttpServletResponseresponse,Contextctx)How Velocity works? 基于基于WEB的应用的应用 2024/7/25202
28、4/7/25Stringp1=Bob;Stringp2=Harold;VectorpersonList=newVector();personList.addElement(p1);personList.addElement(p2);/*将模板数据list放置到上下文环境context中去*/ctx.put(theList,personList);How Velocity works? 基于基于WEB的应用的应用 2024/7/252024/7/25/*获取模板对象,有三种可能产生的异常*/Templateoutty=null;Tryoutty=getTemplate(sample.vm);ca
29、tch(ParseErrorExceptionpee)System.out.println(SampleServlet:parseerrorfortemplate+pee);catch(ResourceNotFoundExceptionrnfe)System.out.println(SampleServlet:templatenotfound+rnfe);catch(Exceptione)System.out.println(Error+e);returnoutty;4、Web应用程序配置文件应用程序配置文件web.xml:How Velocity works? 基于基于WEB的应用的应用 2
30、024/7/252024/7/25VelocityAppWebSampleServletSampleServletcom.cyberobject.study.velocity.servlet.SampleServletorg.apache.velocity.properties/WEB-INF/classes/velocity.properties1How Velocity works? 基于基于WEB的应用的应用 2024/7/252024/7/25SampleServlet/SampleServletindex.jsp三、发布及运行三、发布及运行编译后,发布到你熟悉的应用服务器中去,如To
31、mcat等。启动服务器,在浏览器中输入:http:/localhost:8080/VelocityAppWeb/SampleServlet,可看到如下结果:How Velocity works? 基于基于WEB的应用的应用 2024/7/252024/7/25How Velocity works? 基于基于WEB的应用的应用 2024/7/252024/7/25四、小结:四、小结:在servlet中使用Velocity的步骤和在独立应用程序中是基本相似的:1、获得并初始化一个模板引擎;2、以模板文件名为参数,调用getTemplate()得到一个模板对象;3、创建一个上下文环境对象,并将模板数
32、据放入上下文环境中;4、合并(merge)模板和数据并产生一个输出。事实上,有很多步骤如1、4,VelocityServlet基类都已经帮我们做了,就连3中的创建上下文环境对象都已经代劳了,你所要做的仅仅是通过指定模板文件名获得一个模板对象和将数据put到上下文中去。注意事项:注意事项:1、不要在servlet中实现doGet()和doPost()方法。VelocityServlet已经帮你完成了。2、web.xml文件中SampleServlet的初始化参数name的写法:org.apache.velocity.properties,这是固定的,它是VelocityServlet中的常量IN
33、IT_PROPS_KEY对应的值。当然如果在你的servlet中loadConfiguration()方法中不使用该常量名时,你也可以随便取名,只要和这里的StringpropsFile=config.getInitParameter(INIT_PROPS_KEY);参数名对应上即可。How Velocity works? 基于基于WEB的应用的应用 2024/7/252024/7/25VTL(Velocity Template Language)介介绍 VTLVTL提供一种简单、容易和干静的方法将动态内容合并到提供一种简单、容易和干静的方法将动态内容合并到WebWeb页面。页面。VTLVTL
34、使用使用引用引用(references)(references)将动态内容插入到将动态内容插入到WebWeb页面中。变量是一种引用,可以指页面中。变量是一种引用,可以指向向JavaJava代码中的定义内容,或者由代码中的定义内容,或者由WebWeb页面中的页面中的VTLVTL语句来获得值。下面是语句来获得值。下面是一个可以插入到一个可以插入到HTMLHTML文档的文档的VTLVTL语句的例子:语句的例子:#set($a=“Velocity”)#set($a=“Velocity”)VTLVTL语句以语句以#开头,并包含指令开头,并包含指令(set)(set)。变量以。变量以$ $开头,值用引号引
35、起。引号可开头,值用引号引起。引号可以是单引号,也可以是双引号。前者引用具体的以是单引号,也可以是双引号。前者引用具体的StringString值值( (即即单引号中的引用单引号中的引用会原样输出会原样输出 ) );后者可以包含;后者可以包含VelocityVelocity引用(即引用(即引用会替换成相应的值引用会替换成相应的值),例),例如如” ”hello,$name”hello,$name”, $name$name会用其当前的值替换。上面的例子是将值会用其当前的值替换。上面的例子是将值VelocityVelocity赋值给变量赋值给变量a a。当变量被赋值后,就可以在当变量被赋值后,就可
36、以在HTMLHTML文档的任何地方引文档的任何地方引用了。用了。 2024/7/252024/7/25VTL(Velocity Template Language)介介绍注释注释 VTL支持单行注释(以#开始)和多行注释(包括在#*和*#之间)引用引用(References) 变量变量 变量的格式:变量的格式:$VTL标识符标识符 #set($foo=gibbous) 属性属性 属性的格式:属性的格式:$VTL标识符标识符. VTL标识符标识符 $customer.Address$purchase.Total 方法方法 方法的格式:方法的格式:$VTL标识符标识符(参数列表参数列表)$cust
37、omer.getAddress()$purchase.getTotal()$page.setTitle(MyHomePage)$person.setAttributes(Strange,Weird,Excited) 正则引用符号正则引用符号(FormalReferenceNotation):):#set($vice=klepto)#set($vice=klepto)JackisaJackisa$vice$vicemaniac.maniac. 2024/7/252024/7/25VTL(Velocity Template Language)介介绍 Quiet引用符号:引用符号:! 当当$emai
38、l没有值时,没有值时,Velocity会用空串替代会用空串替代$email 特殊字符转义特殊字符转义 对于对于$、#等特殊字符要正常显示,可以使用等特殊字符要正常显示,可以使用进行转义,进行转义,转义为转义为 指令指令(Directives) 引用允许模板设计者为引用允许模板设计者为Web站点生成动态内容,而指令使站点生成动态内容,而指令使巧妙处理巧妙处理Java代码的脚本元素容易使用代码的脚本元素容易使用 #set 格式:格式:#set(LHS=RHS)LHS可以是变量引用或属性引用可以是变量引用或属性引用RHS可以是引用、字符串、数字、可以是引用、字符串、数字、ArrayList或或Map
39、如果如果如果如果RHSRHS的结果为的结果为的结果为的结果为nullnull,是不会赋值给,是不会赋值给,是不会赋值给,是不会赋值给LHSLHS的的的的 #if / #elseif / #else 2024/7/252024/7/25VTL(Velocity Template Language)介介绍 #if / #elseif / #else#if($foo)Velocity!#end条件成立有两种情况:如果条件成立有两种情况:如果$foo是是boolean,则,则$foo要为要为true;否则,否则,$foo不为不为null 循环:循环:foreach #foreach($producti
40、n$allProducts)$product#end$allProducts的内容可以是的内容可以是Vector、Hashtable或或ArrayList,每次取,每次取出一个值赋给出一个值赋给$product;返回的值是一个;返回的值是一个Java对象,可用来引用具体的方法对象,可用来引用具体的方法可以在可以在#foreach指令中使用范围操作符指令中使用范围操作符n.m,其中,其中n和和m必须是整型必须是整型 2024/7/252024/7/25VTL(Velocity Template Language)介介绍 #include #include指令导入本地文件到指令导入本地文件到#in
41、clude指令定义的地方。导入的文件内容指令定义的地方。导入的文件内容不会被模板引擎解析。不会被模板引擎解析。#include(greetings.txt,$seasonalstock) #parse#parse指令允许导入一个包含指令允许导入一个包含VTL的本地文件,并由模板引擎进行解析。的本地文件,并由模板引擎进行解析。#parse指令导入的文件必须放在指令导入的文件必须放在TEMPLATE_ROOT目录下,并且一次只能导目录下,并且一次只能导入一个文件。入一个文件。 #stop #stop指令停止模板引擎的执行并返回。指令停止模板引擎的执行并返回。 #macro#macro指令允许定义一
42、段重复使用的指令允许定义一段重复使用的VTL模板(称模板(称Velocimacros)。)。Velocimacros可以有可以有0或多个参数。或多个参数。 2024/7/252024/7/25VTL(Velocity Template Language)介介绍#macro(tablerows$color$somelist)#foreach($somethingin$somelist)$something#end#end这个叫这个叫tablerows的的Velocimacro带带2个参数:一个个参数:一个color和一个和一个array。下面的代码包含对下面的代码包含对tablerows的调用:的调用:#set($greatlakes=Superior,Michigan,Huron,Erie,Ontario)#set($color=“yellow)#tablerows($color$greatlakes)输出结果为:输出结果为:VTL的详细介绍请参见的详细介绍请参见Velocity用户指南用户指南2024/7/252024/7/25Velocity应用用2024/7/252024/7/25谢谢各位谢谢各位 !2024/7/252024/7/25