`

velocity 资料 (中)

阅读更多
Velocity利用了很多java规范以方便了设计人员的使用。例如:
HTML代码
  1. $foo   
  2. $foo.getBar()   
  3. ## is the same as   
  4. $foo.Bar   
  5.   
  6. $data.getUser(“jon”)   
  7. ## is the same as   
  8. $data.User(“jon”)   
  9.   
  10. $data.getRequest().getServerName()   
  11. # is the same as   
  12. $data.Request.ServerName   
  13. ## is the same as   
  14. ${data.Request.ServerName}  

但是,注意VTL中不会将reference解释为对象的实例变量。例如:$foo.Name将被解释为Foo对象的getName()方法,而不是Foo对象的Name实例变量。
Directives(google translate:指令)
Reference允许设计者使用动态的内容,而directive使得你可以应用java代码来控制你的显示逻辑,从而达到你所期望的显示效果。
  #set
  #set directive被用于设置一个reference的值。例如:
    #set ( $primate = “monkey” )
    #set ( $customer.Behavior = $primate )
赋值左侧的(LHS)必须是一个变量或者属性reference。右侧(RHS)可以是以下类型中一种:
l  变量reference
l  String literal
l  属性reference
l  方法reference
l  number literal
l  ArrayList
下面是应用各种类型的RHS的例子:
HTML代码
  1. set ( $monkey = $bill ) ##变量reference   
  2. set ( $monkey.Friend = “monica” ) ##String literal   
  3. set ( $monkey.Blame = $whitehouse.Leak )##属性reference   
  4. set ( $monkey.Plan = $spindoctor.weave($web) )##方法reference   
  5. set ( $monkey.Number = 123 )##Number literal   
  6. set ( $monkey.Say = [“Not”, $my, “fault”] )##ArrayList  

注意:最后一个例子的取值方法为:$monkey.Say.get(0)
RHS也可以是一个简单的算术表达式:
HTML代码
  1. #set ( $value = $foo + 1 )   
  2. #set ( $value = $bar -1 )   
  3. #set ( $value = $foo * $bar )   
  4. #set ( $value = $foo / $bar )  

如果你的RHS是一个null,VTL的处理将比较特殊:它将指向一个已经存在的reference,这对初学者来讲可能是比较费解的。例如:
  #set ( $resut = $query.criteria(“name”) )
  The result of the first query is $result

  #set ( $resut = $query.criteria(“address”) )
  The result of the second query is $result
如果$query.criteria(“name”)返回一个“bill”,而$query.criteria(“address”)返回的是null,则显示的结果如下:
  The result of the first query is bill
  The result of the first query is bill
看看下面的例子:
Velocity代码
  1. #set( $criteria = ["name""address"] )   
  2. #foreach( $criterion in $criteria )   
  3. #set( $result = $query.criteria($criterion) )   
  4. #if( $result )   
  5.     Query was successful   
  6. #end   
  7. #end  


在上面的例子中,程序将不能智能的根据$result的值决定查询是否成功。在$result被#set后(added to the context),它不能被设置回null(removed from the context)。打印的结果将显示两次查询结果都成功了,但是实际上有一个查询是失败的。
为了解决以上问题我们可以通过预先定义的方式:

Velocity代码
  1. #set( $criteria = [“name”, “address”] )   
  2. #foreach( $criterion in $criteria )   
  3.   #set( $result = false )   
  4.   #set( $result = $query.criteria( $criterion ) )   
  5.   #if( $result )   
  6.     Query was successful   
  7.   #end   
  8. #end   
  9. String Literals    

  当你使用#set directive,String literal封闭在一对双引号内。
    #set ( $directoryRoot = “www” )
    #set ( $templateName = “index.vm” )
    #set ( $template = “$directoryRoot/$tempateName” )
    $template
  上面这段代码的输出结果为:www/index.vm
  但是,当string literal被封装在单引号内时,它将不被解析:
    #set ( $foo = “bar” )
    $foo
    #set ( $blargh = ‘$foo’ )
  结果:
    bar
    $foo
  上面这个特性可以通过修改velocity.properties文件的stringliterals.interpolate = false的值来改变上面的特性是否有效。
条件语句
  if/else if/else
当一个web页面被生成时使用Velocity的#if directrive,如果条件成立的话可以在页面内嵌入文字。例如:
  #if ( $foo )
    Velocity!
  #end
上例中的条件语句将在以下两种条件下成立:
l  $foo是一个boolean型的变量,且它的值为true
l  $foo变量的值不为null
这里需要注意一点:Velocity context仅仅能够包含对象,所以当我们说“boolean”时实际上代表的时一个Boolean对象。即便某个方法返回的是一个boolean值,Velocity也会利用内省机制将它转换为一个Boolean的相同值。
如果条件成立,那么#if和#end之间的内容将被显示。
#elseif和#else元素可以同#if一同使用。例如:
  #if( $foo < 10 )
     Go North
  #elseif( $foo == 10 )
     Go East
  #elseif( $foo == 6 )
     Go South
  #else
     Go West
  #end
注意这里的Velocity的数字是作为Integer来比较的――其他类型的对象将使得条件为false,但是与java不同它使用“==”来比较两个值,而且velocity要求等号两边的值类型相同。
关系、逻辑运算符
Velocity中使用等号操作符判断两个变量的关系。例如:
#set ( $foo = “deoxyribonucleic acid” )
#set ( $bar = “ribonucleic acid” )
#if ( $foo == $foo )
  In this case it’s clear they aren’t equivalent.So…
#else
  They are not equivalent and this will be the output.
#end

Velocity有AND、OR和NOT逻辑运算符。下面是一些例子:
  ## logical AND
  #if( $foo && $bar )
     This AND that
  #end

  ## logical OR
  #if ( $foo || $bar )
    This OR That
  #end

  ##logical NOT
  #if ( !$foo )
     NOT that
  #end
循环
  Foreach循环
  例子:
    

Html 代码
  1. <ul>   
  2.   #foreach ( $product in $allProducts )   
  3.     <li> $product </li>   
  4.   #end  
  5. </ul>   


  每次循环$allProducts中的一个值都会赋给$product变量。
$allProducts可以是一个Vector、Hashtable或者Array。分配给$product的值是一个java对象,并且可以通过变量被引用。例如:如果$product是一个java的Product类,并且这个产品的名字可以通过调用他的getName()方法得到。
现在我们假设$allProducts是一个Hashtable,如果你希望得到它的key应该像下面这样:

Html代码
  1. <ul>   
  2. #foreach ( $key in $allProducts.keySet() )   
  3. <li>Key: $key -> Value: $allProducts.get($key) </li>   
  4. #end  
  5. </ul>  

Velocity还特别提供了得到循环次数的方法,以便你可以像下面这样作:

Html 代码
  1. <table>   
  2. #foreach ( $customer in $customerList )   
  3. <tr><td>$velocityCount</td><td>$customer.Name</td></tr>   
  4. #end  
  5. </table>   


$velocityCount变量的名字是Velocity默认的名字,你也可以通过修改velocity.properties文件来改变它。默认情况下,计数从“1”开始,但是你可以在velocity.properties设置它是从“1”还是从“0”开始。下面就是文件中的配置:
  # Default name of loop counter
  # variable reference
  directive.foreach.counter.name = velocityCount

  # Default starting value of the loop
  # counter variable reference
  directive.foreach.counter.initial.value = 1

include
#include script element允许模板设计者引入本地文件。被引入文件的内容将不会通过模板引擎被render。为了安全的原因,被引入的本地文件只能在TEMPLATE_ROOT目录下。
  #inclued ( “one.txt” )
如果您需要引入多个文件,可以用逗号分隔就行:
  #include ( “one.gif”, “two.txt”, “three.htm” )
在括号内可以是文件名,但是更多的时候是使用变量的:
  #inclue ( “greetings.txt”, $seasonalstock )

parse
#parse script element允许模板设计者一个包含VTL的本地文件。Velocity将解析其中的VTL并render模板。
  #parse( “me.vm” )
就像#include,#parse接受一个变量而不是一个模板。任何由#parse指向的模板都必须包含在TEMPLATE_ROOT目录下。与#include不同的是,#parse只能指定单个对象。
你可以通过修改velocity.properties文件的parse_direcive.maxdepth的值来控制一个template可以包含的最多#parse的个数――默认值是10。#parse是可以递归调用的,
例如:如果dofoo.vm包含如下行:
  Count down.

Velocity 代码
  1. #set ( $count = 8 )   
  2. #parse ( “parsefoo.vm” )   
  3. All done with dofoo.vm!  

那么在parsefoo.vm模板中,你可以包含如下VTL:

Velocity代码
  1. $count   
  2. #set ( $count = $count – 1 )   
  3. #if ( $count > 0 )   
  4.   #parse( “parsefoo.vm” )   
  5. #else  
  6.   All done with parsefoo.vm!   
  7. #end  


的显示结果为:
  Count down.
  8
  7
  6
  5
  4
  3
  2
  1
  0
  All done with parsefoo.vm!
  All done with dofoo.vm!

分享到:
评论

相关推荐

    velocity的学习资料

    在这个"velocity的学习资料"压缩包中,我们很可能会找到关于Velocity的基本概念、语法、最佳实践以及如何将其整合到Java Web项目中的相关信息。 1. **Velocity基本概念** - **模板语言**: Velocity使用简单的文本...

    Velocity资料

    文件中提到了一些中文资料,如《VelocityJava开发指南中文版》、《Velocity模板使用指南中文版》等,这表明Velocity社区提供了相当完善的中文资料,有助于Java开发者更快速地学习和掌握Velocity的使用方法。...

    Velocity资料汇总

    【Velocity资料汇总】 Velocity,作为一个开源的Java模板引擎,是Apache软件基金会的Jakarta项目之一。它被设计用于Web应用程序中的动态网页生成,但也可以应用于任何需要将结构化数据转化为文本输出的场景,如生成...

    velocity中文资料以及实例详解

    Velocity 是一个基于Java的模板引擎,它允许网页设计师在页面中嵌入动态内容,而无需直接接触Java代码。...无论你是新手还是经验丰富的开发者,这份Velocity中文资料都将是你理解和掌握Velocity的强大工具。

    velocity学习资料.zip

    在这个“velocity学习资料.zip”压缩包中,可能包含了关于Velocity的基本概念、语法、最佳实践以及一些示例代码,帮助初学者或有经验的开发者更好地理解和应用Velocity。 Velocity的工作原理基于MVC(Model-View-...

    velocity中文

    **Velocity中文手册与学习资料详解** Velocity是一款基于Java的模板引擎,它允许开发者将HTML页面设计与业务逻辑相分离,让网页设计人员专注于页面布局,而程序员则专注于编写控制逻辑。Velocity通过简单的语法使得...

    apache velocity介绍及资料

    在使用Velocity时,你需要创建一个Velocity上下文(Context),在这个上下文中添加你想要在模板中访问的对象。然后,通过Velocity模板引擎将这个上下文和模板文件合并,生成最终的输出。Velocity引擎会自动处理对象的...

    给公司内部人员培训资料 velocity

    1. **取变量**:在 Velocity 中,我们可以直接使用 `$` 符号来访问变量,如 `$customer` 表示取名为 `customer` 的变量。如果要访问对象的属性,可以使用点操作符,例如 `$customer.Name` 来获取 `customer` 对象的 ...

    Velocity

    - 博文链接:[https://zxymicky.iteye.com/blog/1112064](https://zxymicky.iteye.com/blog/1112064) 这个链接可能提供有关Velocity的进一步学习资料或实例教程。 通过掌握Velocity,开发者可以提高Web应用的开发...

    JAVA的Velocity语法学习

    Velocity是Apache软件基金会下的一个开源项目,它是一个基于Java的模板引擎,主要用在Web应用中生成动态内容。Velocity通过简单的语法,将业务逻辑与表现层分离,使得开发者可以专注于业务逻辑的编写,而不用关心...

    velocity插件与学习文档

    Velocity插件通常是集成在构建工具(如Maven或Gradle)或IDE(如Eclipse或IntelliJ IDEA)中,以方便开发者更高效地使用Velocity模板语言。这些插件通常提供自动完成、语法高亮、错误检查等功能,提高开发效率和代码...

    velocity初学者资料

    在初学者资料中,我们首先了解了Velocity的基本概念。Velocity的主要优点包括它简洁的语法、高效的性能以及良好的可扩展性。通过集成Struts2,Velocity可以被用于构建动态Web应用程序,帮助开发者更方便地管理视图层...

    velocity_中文手册

    1. **学习资源相对较少**:相较于主流的技术栈如React、Vue等,关于Velocity的学习资料和社区支持较为有限。 2. **生态系统不如主流技术成熟**:在某些高级功能的支持方面,如组件化开发等方面,Velocity可能不如...

    Java进阶教程Velocity快速掌握模板引擎视频

    但是遗憾的是 , 市面上并没有一款详细的Velocity教程 , 特别是最新版本的velocity使用, 相关资料更是少的可怜 ! 所以我们这套课程有如下特色 : l 从基础开始 : 只要有一些java开发的基础就可以学习第一部分velocity...

    Velocity学习资料

    这与JSP(JavaServer Pages)有所不同,JSP虽然也实现了视图和控制的分离,但仍然允许在页面中嵌入Java代码,而Velocity完全避免了这种混合。 在Velocity中,模板语言称为Velocity Template Language (VTL),它是一...

    Mastering.Apache.Velocity

    ### Apache Velocity概述与核心特性 #### 一、Apache Velocity简介 Apache Velocity 是一款基于 Java 的模板引擎,由 Apache 软件基金会...对于想要深入了解 Velocity 的开发者来说,这本书是非常有价值的参考资料。

    velocity技术资料

    `Velocity_《VTL语法参考指南》中文版.doc` 提供了详细的学习材料,`velocity-1.6.jar` 是实际开发中必不可少的库,而`velocity.ppt` 则可能是进一步了解和学习Velocity的辅助资料。对于想要深入了解和使用Velocity...

    velocity示例

    根据提供的标题、描述、标签及部分内容,我们可以了解到这段资料主要涉及的是Velocity模板引擎在.NET环境下的使用,并且特别提到了如何解决中文字符显示时出现的乱码问题。下面将对这些知识点进行详细的解读。 ### ...

    velocity基础资料

    这份压缩包中的"Velocity"文件包含了更详细的学习资料,包括示例代码、教程文档等,建议结合实际案例进行学习,以加深对Velocity的理解。 总之,Velocity是Java Web开发中一个强大的工具,通过熟悉其基本概念和语法...

    Velocity 资料汇总

    花了所有CSDN积分收集来的Velocity资料集合: Velocity Java开发指南中文版 Velocity Web应用开发指南中文版 Velocity模板使用指南中文版 VTL语法参考指南中文版 DB4O系统应用之起步篇 velocity用户手册 velocity...

Global site tag (gtag.js) - Google Analytics