Velocity 介绍


VelocityVelocity 模板介绍模板介绍 1.1.VelocityVelocity概述概述 ?? � VelocityVelocityVelocityVelocity是一个基于javajavajavajava的模板引 擎(template enginetemplate enginetemplate enginetemplate engine:模板引擎 的作用就是取得数据并加以处理, 最后显示出数据 )。它允许任何 人仅仅简单的使用模板语言 (template languagetemplate languagetemplate languagetemplate language)来引用由 javajavajavajava代码定义的对象。 2.Velocity2.Velocity的的应应用用领域领域 � WebWebWebWeb应用的开发。 � 作为模板产生SQL,XMLSQL,XMLSQL,XMLSQL,XML或代码等。 � 作为其他系统的集成组件使用 3. Velocity3. Velocity工作流程和原理工作流程和原理 当Velocity 应用于application program或 a servlet,你通常将做 下面的事情 � 初始化Velocity. � 创建Context对象 � 添加数据到Context � 选择模板 � 合并模板和数据产生输出页面 3.1Velocity3.1Velocity原理举例说明原理举例说明 public static void main(String[] public static void main(String[] public static void main(String[] public static void main(String[] argsargsargsargs) ) ) ) throws Exception {throws Exception {throws Exception {throws Exception { Velocity.Velocity.Velocity.Velocity.initinitinitinit();();();(); VelocityContextVelocityContextVelocityContextVelocityContext context = new context = new context = new context = new VelocityContextVelocityContextVelocityContextVelocityContext();();();(); context.put("name", context.put("name", context.put("name", context.put("name", ““““Velocity");Velocity");Velocity");Velocity"); BufferedWriterBufferedWriterBufferedWriterBufferedWriter writer = new writer = new writer = new writer = new BufferedWriterBufferedWriterBufferedWriterBufferedWriter(new (new (new (new OutputStreamWriterOutputStreamWriterOutputStreamWriterOutputStreamWriter(((( System.System.System.System.outoutoutout));));));)); Template template = Template template = Template template = Template template = Velocity.Velocity.Velocity.Velocity.getTemplategetTemplategetTemplategetTemplate("("("("srcsrcsrcsrc/velocity/hell/velocity/hell/velocity/hell/velocity/hell o.o.o.o.vmvmvmvm");");");"); template.merge(context, writer);template.merge(context, writer);template.merge(context, writer);template.merge(context, writer); writer.flush();writer.flush();writer.flush();writer.flush(); writer.close();writer.close();writer.close();writer.close(); }}}} 3.1Velocity3.1Velocity原理举例说明原理举例说明 Velocity Velocity Velocity Velocity 文件(hello.hello.hello.hello.vmvmvmvm))))
<<<>>>
>>> hello hello hello hello $name;$name;$name;$name;
这个例子的输出效果为: Hello VelocityHello VelocityHello VelocityHello Velocity 4. 4. VTLVTLVTLVTLVTLVTLVTLVTL介绍介绍 VTLVTLVTLVTL提供一种简单、容易和干静的方法将 动态内容合并到WebWebWebWeb页面。VTLVTLVTLVTL使用引 用((((references)references)references)references)将动态内容插入到WebWebWebWeb页 面中。变量是一种引用,可以指向JavaJavaJavaJava 代码中的定义内容,或者由WebWebWebWeb页面中 的VTLVTLVTLVTL语句来获得值。 例如:#set( $a = "Velocity" ) VTL语句以#开头,并包含指令(set)。变 量以$开头,用引号引起 VTL语法包括: 1,注释 2,引用(References) 3,指令(Directives) 4.1VTL---4.1VTL---注释注释 VTLVTLVTLVTL支持单行注释(以########开始)和多行注 释(包括在####****和****####之间),下面是一个 例子: ## ## ## ## This text is notThis text is notThis text is notThis text is not visible.visible.visible.visible. # # # #**** This text, as part of a multi-line This text, as part of a multi-line This text, as part of a multi-line This text, as part of a multi-line comment,comment,comment,comment, is not visible. This text is not visible; it is not visible. This text is not visible; it is not visible. This text is not visible; it is not visible. This text is not visible; it is also part of theis also part of theis also part of theis also part of the multi-line comment. This text still not multi-line comment. This text still not multi-line comment. This text still not multi-line comment. This text still not visible.visible.visible.visible. ****#### 4.2VTL---4.2VTL---引用引用((References)References) VTLVTLVTLVTL有3333种类型的引用:变量、属性和方法。 (1)变量 变量的格式:$VTL标识符 VTL标识符以字母开始,由字母、数字、 横划线(-)或下划线(_)组成。 例如下面的例子: #set( $foo = "gibbous" ) $moon = $foo 输出结果是:$moon = gibbous 4.2VTL---4.2VTL---引用引用((References)References) (2222)属性 属性的格式:$$$$VTLVTLVTLVTL标识符. . . . VTLVTLVTLVTL标识符 下面是属性引用的例子: $$$$customer.Addresscustomer.Addresscustomer.Addresscustomer.Address $purchase.Total$purchase.Total$purchase.Total$purchase.Total 拿第一例子来说,有两种意思: 返回HashtableHashtableHashtableHashtable对象customercustomercustomercustomer中键值 为AddressAddressAddressAddress的值 $customer.getAddress()$customer.getAddress()$customer.getAddress()$customer.getAddress()方法引用的缩 写(JavaBeanJavaBeanJavaBeanJavaBean属性的gettergettergettergetter方法) 至于是哪种情况,VelocityVelocityVelocityVelocity会做决定,返 回合适的值。 4.2VTL---4.2VTL---引用引用((References)References) (3333)方法 方法的格式:$$$$VTLVTLVTLVTL标识符((((参数列表)))) 下面是方法引用的例子: $$$$customer.getAddress()customer.getAddress()customer.getAddress()customer.getAddress() $purchase.getTotal() $purchase.getTotal() $purchase.getTotal() $purchase.getTotal() $page.setTitle( "My Home Page" ) $page.setTitle( "My Home Page" ) $page.setTitle( "My Home Page" ) $page.setTitle( "My Home Page" ) $person.setAttributes( ["Strange", $person.setAttributes( ["Strange", $person.setAttributes( ["Strange", $person.setAttributes( ["Strange", "Weird", "Excited"] )"Weird", "Excited"] )"Weird", "Excited"] )"Weird", "Excited"] ) 4.3VTL---4.3VTL---指令指令((DirectivesDirectives)) 详解以下VTL常用指令: 1.1.1.1. ####setsetsetset 2.2.2.2. ####if / #elseif / #elseif / #elseif / #elseif / #elseif / #elseif / #elseif / #else 3. 循环:foreachforeachforeachforeach 4.4.4.4. ####includeincludeincludeinclude 5. ####parseparseparseparse 6.6.6.6. ####stopstopstopstop 7.7.7.7. ####macromacromacromacro 4.3.1VTL---4.3.1VTL---##set(1)set(1) (1111)####setsetsetset 格式:####set( LHS = RHS )set( LHS = RHS )set( LHS = RHS )set( LHS = RHS ) � LHSLHSLHSLHS可以是变量引用或属性引用 � RHSRHSRHSRHS可以是引用、字符串、数字、ArrayListArrayListArrayListArrayList或 MapMapMapMap 例如: ####set( $monkey = $bill ) ## variable referenceset( $monkey = $bill ) ## variable referenceset( $monkey = $bill ) ## variable referenceset( $monkey = $bill ) ## variable reference #set( $monkey.Friend = "monica" ) ## string #set( $monkey.Friend = "monica" ) ## string #set( $monkey.Friend = "monica" ) ## string #set( $monkey.Friend = "monica" ) ## string literalliteralliteralliteral #set( $monkey.Blame = $whitehouse.Leak ) #set( $monkey.Blame = $whitehouse.Leak ) #set( $monkey.Blame = $whitehouse.Leak ) #set( $monkey.Blame = $whitehouse.Leak ) ## property reference## property reference## property reference## property reference #set( $monkey.Number = 123 ) ##number #set( $monkey.Number = 123 ) ##number #set( $monkey.Number = 123 ) ##number #set( $monkey.Number = 123 ) ##number literalliteralliteralliteral #set( $monkey.Say = ["Not", $my, "fault"] ) #set( $monkey.Say = ["Not", $my, "fault"] ) #set( $monkey.Say = ["Not", $my, "fault"] ) #set( $monkey.Say = ["Not", $my, "fault"] ) ## ArrayList## ArrayList## ArrayList## ArrayList 4.3.1VTL---4.3.1VTL---##setset (1111)####setsetsetset � RHSRHSRHSRHS可以是简单的算术表达式 � 如果RHSRHSRHSRHS的结果为nullnullnullnull,是不会赋值给LHSLHSLHSLHS的 � StringStringStringString文字可以使用双引号或单引号括起。两者 的主要区别是双引号中的引用会替换成相应的 值,而单引号中的引用原样输出 例如: ####set( $value = $foo + 1 ) set( $value = $foo + 1 ) set( $value = $foo + 1 ) set( $value = $foo + 1 ) ######## Addition Addition Addition Addition ####set( $directoryRoot = "www" )set( $directoryRoot = "www" )set( $directoryRoot = "www" )set( $directoryRoot = "www" ) #set( $templateName = "index.vm" )#set( $templateName = "index.vm" )#set( $templateName = "index.vm" )#set( $templateName = "index.vm" ) #set($template= #set($template= #set($template= #set($template= $directoryRoot/$templateName" )$directoryRoot/$templateName" )$directoryRoot/$templateName" )$directoryRoot/$templateName" ) $template$template$template$template 输出结果是:www/index.vmwww/index.vmwww/index.vmwww/index.vm 4.3.2VTL---#if#else4.3.2VTL---#if#else (2222)#if / #elseif / #else#if / #elseif / #else#if / #elseif / #else#if / #elseif / #else #if#if#if#if指令在条件成立时,显示####ifififif和####endendendend之间的内 容,否则显示####elseelseelseelse和####endendendend之间的内容。下面是 一个例子: ####if( $foo )if( $foo )if( $foo )if( $foo ) Velocity!Velocity!Velocity!Velocity! #end#end#end#end 条件成立有两种情况: � 如果$$$$foofoofoofoo是booleanbooleanbooleanboolean,则$$$$foofoofoofoo要为truetruetruetrue; � 否则,$$$$foofoofoofoo不为nullnullnullnull ####ifififif指令中可以使用的关系和逻辑符号包括: � < < < <、<=<=<=<=、========、>=>=>=>=、>>>> � &&(and)&&(and)&&(and)&&(and)、||(or)||(or)||(or)||(or)、!(not)!(not)!(not)!(not) 4.3.3VTL---4.3.3VTL---##foreachforeach (3333)####foreachforeachforeachforeach #foreach( $product in $allProducts )#foreach( $product in $allProducts )#foreach( $product in $allProducts )#foreach( $product in $allProducts ) $product$product$product$product #end#end#end#end $allProducts$allProducts$allProducts$allProducts的内容可以是VectorVectorVectorVector、 HashtableHashtableHashtableHashtable或ArrayListArrayListArrayListArrayList,每次取出一个 值赋值给$$$$productproductproductproduct 4.3.4VTL---4.3.4VTL---#include#include#include#include#include#include#include#include (4444)#include#include#include#include #include#include#include#include指令导入本地文件到####includeincludeincludeinclude指 令定义的地方。导入的文件内容不会被 模板引擎解析。出于安全考虑,导入的 文件应该放在TEMPLATE_ROOTTEMPLATE_ROOTTEMPLATE_ROOTTEMPLATE_ROOT目录 下。一次可以导入多个文件,文件名之 间用逗号分隔;并且通常使用变量引用 来替代文件名。下面是一个例子: #include("greetings.txt", seasonalstock )#include("greetings.txt", seasonalstock )#include("greetings.txt", seasonalstock )#include("greetings.txt", seasonalstock ) 4.3.5VTL---4.3.5VTL--- #parse#parse#parse#parse#parse#parse#parse#parse (5555)#parse#parse#parse#parse #parse#parse#parse#parse指令允许导入一个包含VTLVTLVTLVTL的本 地文件,并由模板引擎进行解析。 例如: #parse( "parsefoo.vm" ) 4.3.6VTL---#stop4.3.6VTL---#stop (6666)#stop#stop#stop#stop #stop#stop#stop#stop指令停止模板引擎的执行并返回。 这在DebugDebugDebugDebug时很有用。 4.3VTL---#macro4.3VTL---#macro (7777)#macro#macro#macro#macro #macro#macro#macro#macro指令允许定义一段重复使用的VTLVTLVTLVTL模板 (称VelocimacrosVelocimacrosVelocimacrosVelocimacros)。 VelocimacrosVelocimacrosVelocimacrosVelocimacros可以有0000或多个参数。例如: ####macro( tablerows $color $somelist )macro( tablerows $color $somelist )macro( tablerows $color $somelist )macro( tablerows $color $somelist ) #foreach( $something in $somelist )#foreach( $something in $somelist )#foreach( $something in $somelist )#foreach( $something in $somelist ) $something$something$something$something #end#end#end#end #end#end#end#end tablerowstablerowstablerowstablerows的调用: ####set($greatlakes = ["Superior","Erie"] )set($greatlakes = ["Superior","Erie"] )set($greatlakes = ["Superior","Erie"] )set($greatlakes = ["Superior","Erie"] ) #set( $color = "blue" )#set( $color = "blue" )#set( $color = "blue" )#set( $color = "blue" ) #tablerows( $color $greatlakes )#tablerows( $color $greatlakes )#tablerows( $color $greatlakes )#tablerows( $color $greatlakes ) 5.Velocity5.Velocity的国际化的国际化 � Velocity本身支持模版的国际化编码转 换,看看Velocity提供的方法: Public Template getTemplate (String tem String encoding) � 另外,在Velocity的tools:MessageTool, 提供了变量text包含国际化标签,这样 只需要简单的编写标签代码即可,如: $text.get(‘‘‘‘title’’’’). 6. 6. VelocityVelocityVelocityVelocityVelocityVelocityVelocityVelocity对对FrameworkFrameworkFrameworkFrameworkFrameworkFrameworkFrameworkFramework的支持的支持 � VelocityTools/VelocityViewServlet 对Servlet 的支持,使 用 VelocityViewServlet 来 代 替 Servlet � Velocity Tools / VelocityStruts 对Struts的支持. � Third party frameworks 对第三方框架的支持,比 如:Spring,Turbine等 6. 6. VelocityVelocityVelocityVelocityVelocityVelocityVelocityVelocity实例实例开发开发 � 实例的功能 实现用Velocity对XML文件的输出。 � XML文件结构 6.1. 6.1. VelocityVelocityVelocityVelocityVelocityVelocityVelocityVelocity实例实例开发开发 � Test.xml xtpdcsse@163.com Team Velocity The Velocity Project this is a test 6.2. 6.2. VelocityVelocityVelocityVelocityVelocityVelocityVelocityVelocity实例实例开发开发 � 实现效果 6.3. 6.3. VelocityVelocityVelocityVelocityVelocityVelocityVelocityVelocity实例实例开发开发 � xml.vm #macro ( recursive $e $indent ) #macro ( recursive $e $indent ) #macro ( recursive $e $indent ) #macro ( recursive $e $indent ) #if( $e.#if( $e.#if( $e.#if( $e.getChildrengetChildrengetChildrengetChildren().size() > 0 )().size() > 0 )().size() > 0 )().size() > 0 ) $indent$indent$indent$indent & & & <ltltlt;;;;$e.$e.$e.$e.getNamegetNamegetNamegetName()()()()&&&>gtgtgt; ; ; ; <<<>>> ####foreachforeachforeachforeach ($child in $e. ($child in $e. ($child in $e. ($child in $e.getChildrengetChildrengetChildrengetChildren() )() )() )() ) #recursive( $child "$indent #recursive( $child "$indent #recursive( $child "$indent #recursive( $child "$indent &&& nbspnbspnbsp;&;&;&; nbspnbspnbsp " ) " ) " ) " ) #end#end#end#end $indent$indent$indent$indent & & & <ltltlt;/;/;/;/$e.$e.$e.$e.getNamegetNamegetNamegetName()()()()&&&>gtgtgt;;;;<<<>>> #else#else#else#else $indent$indent$indent$indent & & & <ltltlt;;;;$e.$e.$e.$e.getNamegetNamegetNamegetName()()()()&&&>gtgtgt;;;;<<<>>> $indent$indent$indent$indent $e.$e.$e.$e.getTextTrimgetTextTrimgetTextTrimgetTextTrim()()()()<<<>>> $indent$indent$indent$indent & & & <ltltlt;/;/;/;/$e.$e.$e.$e.getNamegetNamegetNamegetName()()()()&&&>gtgtgt;;;;<<<>>> #end#end#end#end #end#end#end#end #set($i = "&#set($i = "&#set($i = "&#set($i = " nbspnbspnbsp;&;&;&; nbspnbspnbsp ") ") ") ") 6.4. 6.4. VelocityVelocityVelocityVelocityVelocityVelocityVelocityVelocity实例实例开发开发 � xml.vm <html><head><title><html><head><title><html><head><title>XMLXMLXMLXML <><><>>>> First, we print out the document tree with a First, we print out the document tree with a First, we print out the document tree with a First, we print out the document tree with a recursive recursive recursive recursive VelocimacroVelocimacroVelocimacroVelocimacro : : : : <><><>>>> #recursive( $root.#recursive( $root.#recursive( $root.#recursive( $root.getRootElementgetRootElementgetRootElementgetRootElement() $i )() $i )() $i )() $i ) <><><>>>> Next, we access pieces of data directly :Next, we access pieces of data directly :Next, we access pieces of data directly :Next, we access pieces of data directly : <><><>>>> email : email : email : email : $root.$root.$root.$root.getRootElementgetRootElementgetRootElementgetRootElement()()()()....getChildgetChildgetChildgetChild("properties("properties("properties("properties ").").").").getChildgetChildgetChildgetChild("author").("author").("author").("author").getChildgetChildgetChildgetChild("email").("email").("email").("email").getgetgetget TextTextTextText()()()()<<<>>> last name : last name : last name : last name : $root.$root.$root.$root.getRootElementgetRootElementgetRootElementgetRootElement()()()()....getChildgetChildgetChildgetChild("properties("properties("properties("properties ").").").").getChildgetChildgetChildgetChild("author").("author").("author").("author").getChildgetChildgetChildgetChild("name").("name").("name").("name").getCgetCgetCgetC hildhildhildhild("last").("last").("last").("last").getTextgetTextgetTextgetText()()()()
>>> 6.5. 6.5. VelocityVelocityVelocityVelocityVelocityVelocityVelocityVelocity实例实例开发开发 � Servlet的开发 publicpublicpublicpublic classclassclassclass TestveTestveTestveTestve extendsextendsextendsextends VelocityServletVelocityServletVelocityServletVelocityServlet {{{{ publicpublicpublicpublic Template Template Template Template handleRequesthandleRequesthandleRequesthandleRequest((((HttpServletRequestHttpServletRequestHttpServletRequestHttpServletRequest request,request,request,request,HttpServletResponseHttpServletResponseHttpServletResponseHttpServletResponse response, response, response, response, Context Context Context Context ctxctxctxctx))))throwsthrowsthrowsthrows Exception { Exception { Exception { Exception { Template Template Template Template outtyouttyouttyoutty = = = = nullnullnullnull;;;; String pa = request.String pa = request.String pa = request.String pa = request.getRealPathgetRealPathgetRealPathgetRealPath(((("/""/""/""/");););); Velocity.Velocity.Velocity.Velocity.initinitinitinit();();();(); SAXBuilderSAXBuilderSAXBuilderSAXBuilder builder; builder; builder; builder; Document root = Document root = Document root = Document root = nullnullnullnull;;;; builder = builder = builder = builder = newnewnewnew SAXBuilderSAXBuilderSAXBuilderSAXBuilder();();();(); root = builder.build(pa + root = builder.build(pa + root = builder.build(pa + root = builder.build(pa + "test.xml""test.xml""test.xml""test.xml");););); ctxctxctxctx.put(.put(.put(.put("root""root""root""root", root);, root);, root);, root); outtyouttyouttyoutty = = = = getTemplategetTemplategetTemplategetTemplate(((("/templates/xml."/templates/xml."/templates/xml."/templates/xml.vmvmvmvm"""");););); returnreturnreturnreturn outtyouttyouttyoutty;;;; }}}}}}}} 6.6. 6.6. VelocityVelocityVelocityVelocityVelocityVelocityVelocityVelocity实例实例开发开发 � Web.xml <<<>>> <<<>>>TestveTestveTestveTestve>>> <<<>>>sample.sample.sample.sample.servletservletservletservlet....TestveTestveTestveTestve>>> >>> <<<>>> <<<>>>TestveTestveTestveTestve>>> <<<>>>////TestveTestveTestveTestve>>> >>> 7. 7. VelocityVelocityVelocityVelocityVelocityVelocityVelocityVelocity的优点和的优点和缺点缺点 Velocity的优点 � 简单的模板语法 � 实现对内容和显示方式的分离 Velocity的缺点 � 异常处理以及日志上 8. 8. Velocity Velocity Velocity Velocity Velocity Velocity Velocity Velocity VS XSLTVS XSLT � Velocity的优势在于这种技术对用户后台 Java 代码侵入性非常低,可以与其它 Template 可以任意替换,而不影响用户后 台 Java 代码。另外,Velocity 语 法 很 少,简单易学。 � XSLT的最大优势就在于能XML的超强处理。 9. 9. 总结总结 � Velocity 解决了如何在 Servlet 和 网页之间传 递数据的问题。当然这种传输数据的机制是在 MVC 模式上进行的,也就是View 和 Modle , Controller 之间相互独立工作,一方的修改不影 响其他方变动,他们之间是通过环境变量 (Context)来实现的 。 � Velocity 提供了一个简单的模板语言以供前端网 页制作人员使用,这个模板语言足够简单(大部分 懂得javascript的人就可以很快掌握,其实它比 javascript 要简单的多),当然这种简单是刻意 的,因为它不需要它什么都能做, View 层其实不 应该包含更多的逻辑,Velocity 的简单模板语法 可以满足你所有对页面显示逻辑的需要,这通常已 经足够了 10.10.结束结束 讲解结束,谢谢大家!
还剩32页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

open_sdm

贡献于2013-03-22

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf