`
JenniferAmanda
  • 浏览: 147150 次
  • 性别: Icon_minigender_2
  • 来自: 西安
社区版块
存档分类
最新评论

velocity 基本应用

 
阅读更多
elocity是一个基于java的模板引擎(template engine)。

它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。

当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只 关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。

Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提 供了便利,同时也为我们在JSP和PHP之外又提供了一种可选的方案。



一、Velocity脚本语法摘要

1. 变量

(1)变量的定义:

#set($name = "hello")说明:velocity中变量是弱类型的。

当使用#set 指令时,括在双引号中的字面字符串将解析和重新解释,如下所示:

#set($directoryRoot = "www" )

#set($templateName = "index.vm" )

#set($template = "$directoryRoot/$templateName" )

$template

输出将会是:www/index.vm

注:在velocity中使用$2.5这样的货币标识是没有问题得的,因为velocity中的变量总是以一个大写或者小写的字母开始的。



(2)变量规范的写法

${name},也可以写成:$name。提倡用前面的写法。

例如:你希望通过一个变量$vice来动态的组织一个字符串。

Jack is a $vicemaniac.

本来变量是$vice现在却变成了$vicemaniac,这样Veloctiy就不知道您到底要什么了。所以,

应该使用规范的格式书写 : Jack is a ${vice}maniac

现在Velocity知道变量是$vice而不是$vicemaniac。

注意:当引用属性的时候不能加{}


(3)变量的赋值

$name="hello"

赋值的左边必须是一个变量或者是属性的引用.右边可以是下面六种类型之一:变量引用,字面字符串,属性引用,方法引用,字面数字,数组列表.

例子演示:

    #set( $monkey = $bill )                                                  ## variable reference 变量引用

    #set( $monky.Friend = "monica" )                               ## stirng 字面字符串

    #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 数组列表

注意:①如果上述例子中的右值是null, 则左值不会被赋值,也就是说会保留以前的值。
            ②velocity模板中未被定义的变量将被认为是一个字符串。

                例如:#set($foo = "gibbous")
                            $moon = $foo
                       输出结果为:
                            $moon = gibbous
            ③velocity模板中不会将reference解释为对象的实例变量。

                例如:$foo.Name将被解释为Foo对象的getName()方法,而不是Foo对象的Name实例变量。

                例如:$foo.getBar()  等同于$foo.Bar ;
                            $data.getUser("jon") 等同于$data.User("jon") ;
                            $data.getRequest().getServerName() 等同于$data.Request.ServerName等同于${data.Request.ServerName}



2.循环
#foreach ($element in $list)
     This is $element.
     $velocityCount
#end

例子:
#set( $list = ["pine", "oak", "maple"])
#foreach ($element in $list)
    $velocityCount
    This is $element.<br>
#end
输出的结果为:
1 This is pine.
2 This is oak.
3 This is maple.
说明:
每次循环$list中的一个值都会赋给$element变量。
$list可以是一个Vector、Hashtable或者Array。分配给$element的值是一个java对象,并且可以通过变量被引用。例如:如果$element t是一个java的Product类,并且这个产品的名字可以通过调用他的getName()方法得到。
#foreach ( $key in $list.keySet())
Key: $key -> Value: $list.get($key) <br>
#end
提示:velocity中大小写敏感。Velocity还特别提供了得到循环次数的方法,$velocityCount变量的名字是Velocity默认的名字。

例子:
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


上面三个例子的输出结果为:
  First example:
  1 2 3 4 5
  Second example:
  2 1 0 -1 -2
  Third example:
  0 1


3.条件语句

#if (condition)

#elseif (condition)

#else

#end



4.语句的嵌套

   ## outer foreach

   #foreach ($element in $list)

      ## inner foreach 内循环

      #foreach ($element in $list)

          This is $element. $velocityCount <br>inner<br>

      #end

      ## inner foreach 内循环结束

  

      This is $element.

      $velocityCount <br>outer<br>

#end

语句中也可以嵌套其他的语句,如#if…#else…#end等。



5.注释

(1)单行注释:
  ## This is a single line comment.
(2)多行注释:
  #*
   Thus begins a multi-line comment. Online visitors won’t
   see this text because the Velocity Templating Engine will
   ignore it.
  *#
(3)文档格式:
  #**
   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.关系和逻辑操作符

Velocity 也具有逻辑AND, OR 和 NOT操作符。



## example for AND

#if($foo && $bar)

  <strong> This AND that</strong>

#end

例子中#if()指令仅在$foo和$bar 都为真的时候才为真。如果$foo为假,则表达式也为假;并且 $bar 将不被求值。如果$foo 为真,Velocity模板引擎将继续检查$bar的值,如果 $bar为真,则整个表达式为真。并且输出This AND that。如果 $bar 为假,将没有输出因为整个表达式为假。


7.Velocity中的宏

Velocity中的宏我们可以理解为函数。

①宏的定义

#macro(宏的名称$参数1 $参数2 …)

  语句体(即函数体)

#end

②宏的调用

#宏的名称($参数1 $参数2 …)

      说明:参数之间用空格隔开。



8.#stop

     停止执行模板引擎并返回,把它应用于debug是很有帮助的。



9.#include与#parse

#include和#parse的作用都是引入本地文件,为了安全的原因,被引入的本地文件只能在TEMPLATE_ROOT目录下。

区别:

(1)与#include不同的是,#parse只能指定单个对象。而#include可以有多个

如果您需要引入多个文件,可以用逗号分隔就行:
#include ("one.gif", "two.txt", "three.htm" )
在括号内可以是文件名,但是更多的时候是使用变量的:
#include ( “greetings.txt”, $seasonalstock )

(2)#include被引入文件的内容将不会通过模板引擎解析;

而#parse引入的文件内容Velocity将会解析其中的velocity语法并移交给模板,意思就是说相当与把引入的文件copy到文件中。

#parse是可以递归调用的,例如:如果dofoo.vm包含如下行:

Count down.<br>

#set ($count =

#parse ("parsefoo.vm")

<br>All done with dofoo.vm!

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

$count

#set($count = $count - 1)

#if ( $count > 0 )<br>

    #parse( "parsefoo.vm" )

#else

<br>All done with parsefoo.vm!

#end的显示结果为:

Count down.

8

7

6

5

4

3

2

1

0

All done with parsefoo.vm!

All done with dofoo.vm!

注意:在vm中使用#parse来嵌套另外一个vm时的变量共享问题。如:
->a.vm 里嵌套 b.vm;
->a.vm 里定义了变量 $param;
->b.vm 里可以直接使用$param,无任何限制。
但需要特别注意的是,如果b.vm里同时定义有变量$param,则b.vm里将使用b.vm里定义的值。



10.转义字符'\'的使用

     如果reference被定义,两个’\’意味着输出一个’\’,如果未被定义,刚按原样输出。如:

#set($email = "foo" )

$email

\$email

\\$email

\\\$email

输出:

foo
$email
\foo
\$email

如果$email未定义

$email

\$email

\\$email

\\\$email

输出:

$email
\$email
\\$email
\\$email           (前面三个斜线,这里两个)



11.内在对象

Velocity内置了一些对象,在vm模版里可以直接调用,列举如下:
$request、$response、$session,另外,模板内还可以使用$msg内的消息工具访问 Struts 的国际化资源,达到简便实现国际化的方法。



12.数组访问

对数组的访问在Velocity中存在问题,因为Velocity只能访问对象的方法,而数组又是一个特殊的Array,所以虽然数组可以进行循环列举,但却不能定位访问特定位置的元素,如 strs[2],数组对固定位置元素的访问调用了Array的反射方法get(Object array, int index),而Velocity没能提供这样的访问,所以数组要么改成List等其他类容器的方式来包装,要么就通过公用Util类的方式来提供,传入数组对象和要访问的位置参数,从而达到返回所需值的目的。





二、实例

    首先下载和安装Velocity。下载好后,解开压缩,把velocity-1.5.jar加入到CLASSPATH。

  

    通常,Velocity模板的文件后缀是“.vm”。下面我们要创建一个hellovelocity.vm的模板文件,虽然很简单,但足以证明Velocity模板引擎是否正确安装,也足以显示出Volecity模板分离的内容及其表现方式的一般过程。把下面这行代码加入hellovelocity.vm模板。

       Hello ${name}, this is Velocity working!

    保存hellovelocity.vm模板,然后再新建一个HelloVelocity.java文件,这两个文件最好放入同一目录下。下面是HelloVelocity.java的代码,它显示了在Java程序中调用Velocity模板引擎的一般过程。



HelloVelocity.java

import java.io.StringWriter;
import java.util.Properties;

import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;

public class HelloVelocity {
public static void main(String[] args) throws Exception {
  /* 首先创建一个模板引擎的实例,并予以初始化 */
  VelocityEngine engine = new VelocityEngine();
 
  Properties p = new Properties();
  String basePath = "src/test/velocity/";//这里需要这样写路径!!!
  p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, basePath);  // 设置模板的路径
  engine.init(p);
 
  /* 接着,获得一个模板 */
  Template template = engine.getTemplate( "hellovelocity.vm" );
  /* 创建上下文,填充数据 */
  VelocityContext context = new VelocityContext(); context.put("name", "World");
  /* 现在,把模板和数据合并,输出到StringWriter */
  StringWriter writer = new StringWriter();
  template.merge( context, writer );
  /* 显示结果 */
  System.out.println( writer.toString() );
}
}



hellovelocity.vm

Hello ${name}, this is Velocity working!



分享到:
评论

相关推荐

    Velocity基本标记说明.doc

    Velocity是一个强大的模板引擎,常用于Java应用中的视图层,帮助开发者将静态模板与动态数据结合起来生成输出。在Velocity中,有一些基本的标记和语法,这些标记有助于构建模板并控制其行为。以下是对这些标记的详细...

    velocity-1.5.jar,velocity-1.6.2-dep.jar,velocity-tools-1.3.jar

    在这个版本中,Velocity提供了基本的模板引擎功能,包括变量替换、控制结构(如if、for、foreach)以及宏定义等。它支持JavaBean和Map对象的直接引用,并且通过Action接口可以方便地进行用户自定义操作。此外,...

    Velocity模板应用

    以上就是Velocity模板应用的基本介绍,它提供了高效、灵活的方式来构建动态内容,让开发者可以专注于业务逻辑,而将页面渲染的任务留给模板引擎。通过熟练掌握Velocity,我们可以提高Web应用的开发效率和代码质量。

    Velocity的基本用法

    **Velocity的基本用法** 1. **#set指令**: 用于设置变量,例如`#set($name = "Li Hong")`,这将在上下文中创建一个名为`name`的变量,其值为"Li Hong"。 2. **#if指令**: 用于条件判断,如`#if($age &gt; 18)`表示...

    velocity 入门文档及应用源码,很适合做自动代码生成

    Velocity的中文指南是学习Velocity的基础材料,它涵盖了Velocity的基本概念、语法、指令以及模板设计原则等内容。通过阅读这份文档,初学者可以了解到如何创建和使用Velocity模板,以及如何在模板中嵌入Java变量和...

    velocity入门使用教程

    Velocity是Apache软件基金会下的一个开源模板引擎,用于生成动态Web页面。...通过以上内容的学习,我们能够掌握Velocity模板引擎的基本使用方法,并能够将其应用于Servlet和Spring MVC项目中,完成动态网页内容的生成。

    Velocity从入门到精通

    通过本书的学习,读者不仅可以掌握Velocity的基本用法,还能深入了解MVC设计模式的精髓,并通过具体的示例应用加深对Velocity模板引擎的理解。无论是对于Web开发者还是Web设计者来说,本书都是一个宝贵的资源,能够...

    velocity经典4pdf中文教程

    通过学习这四本书,开发者不仅可以掌握Velocity的基本用法,还能深入了解其在Web开发中的高级应用,从而提高工作效率,创建出更加灵活和易于维护的Web应用。无论你是初学者还是经验丰富的开发者,这套教程都能提供...

    Velocity1.4 学习指南中文版

    ### Velocity1.4 学习指南中文版:关键知识点概览 #### 一、Velocity简介与核心目标 **Velocity** 是一款开源的模板引擎,它...无论是对于初学者还是经验丰富的开发者而言,掌握Velocity的基本用法都是非常有价值的。

    velocity中文

    学习Velocity时,建议从官方文档开始,了解基本语法和使用方法。同时,通过实践项目,比如创建一个简单的Web应用,加深对Velocity的理解。此外,可以参考 Velocity中文手册,它提供了详细的中文解释,对于初学者来说...

    Velocity 和 FreeMarker区别

    - **Velocity**则相对简单,支持基本的字符转义。 7. **数据绑定**: - **FreeMarker**支持更灵活的数据绑定方式,能够轻松地访问和操作Java对象的属性。 - **Velocity**的数据绑定功能虽然不如FreeMarker强大,...

    velocity官方工具包

    Velocity的主要目标是将呈现逻辑从应用逻辑中分离出来,使得开发者可以专注于业务逻辑的实现,而设计人员则可以专注于页面的布局和设计。这个官方工具包不仅包含了Velocity的核心库,还提供了丰富的示例,帮助用户...

    velocity的所有jar包

    这四个JAR文件组合在一起,构成了一个基本的Velocity运行环境。在使用时,通常需要将这些库添加到项目的类路径中,以便Velocity能够正确运行和解析模板。在Web应用中,这通常通过在`WEB-INF/lib`目录下放置这些JAR...

    velocity和freemarker的比较

    以上是对Velocity和FreeMarker的基本介绍和比较,它们都是Java Web开发中的重要工具,理解它们的特性和应用场景有助于选择最适合项目的技术栈。对于标签“源码”和“工具”,我们可以进一步研究这两个模板引擎的源...

    velocity 电子书

    《Velocity》一书是关于Apache Velocity模板引擎的...通过学习《Velocity》电子书,读者不仅可以掌握Velocity的基本用法,还能深入了解其高级特性,从而在实际项目中更有效地利用Velocity来提高开发效率和代码质量。

    Velocity

    在深入 Velocity 的核心概念之前,我们先了解一下它的基本原理。Velocity 将模板语言(如 `.vm` 文件)与Java代码相融合,通过简单的语法结构,如 `${expression}` 和 `#if`, `#foreach` 等控制结构,让开发者可以在...

    Velocity文档中文版

    Velocity 在 Web 开发中的应用: 1. 提供了模板服务,可以将模板与 Java 代码集成,生成动态网页。 2. 能够实现客户化的网页,根据用户的喜好提供个性化的信息。 3. 可以与 Turbine web 开发架构集成,提供模板服务...

    JAVAEE Velocity例子工程

    这个工程旨在通过实际的代码演示,帮助开发者理解并掌握Velocity的基本用法,无需深入学习复杂的配置文件。 在传统的Java Web开发中,视图层通常与业务逻辑和数据层分离,Velocity就扮演了视图的角色,允许开发者将...

    velocity例子

    1. **Velocity的基本概念** - **模板(Template)**:Velocity模板是HTML或XML文件,其中包含Velocity指令和变量,它们在运行时由Velocity解释器替换为实际值。 - **上下文(Context)**:上下文是数据容器,用于...

    velocity文档及其详细语法

    Velocity被广泛应用于Web应用开发、文档生成、报告制作等领域,因其简洁的语法和良好的可读性而备受青睐。本篇将详细介绍Velocity的基本语法和特性。 ## 1. Velocity模板语言基础 Velocity模板语言(VTL)是一种...

Global site tag (gtag.js) - Google Analytics