下面资料整理自网络

一、Velocity介绍

Velocity是Apache公司的开源产品,是一套基于Java语言的模板引擎,可以很灵活的将后台数据对象与模板文件结合在一起,说的直白一点,就是允许任何人使用模板语言引用后台java代码定义的对象Velocity应用于Web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由Java程序开发人员关注业务逻辑编码。Velocity将 java代码从web页面中分离出来,这样为web站点的长期维护提供了便利。

Velocity是一个基于java的模板引擎(templateengine),它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。作为一个比较完善的模板引擎,Velocity的功能是比较强大的,但强大的同时也增加了应用复杂性。

很多人下载了EasyJWeb的开源应用示例,使用EasyJWeb的目的,是在于把页面-程序完成分开,就也就是一个项目中,程序员使用专业Java开发工具(如Eclipse、JBuilder等)来编写、调试、测试程序,页面制作人员使用专业的网页制作工具(如Macromedia Dreamweaver)来设计制作网页,而两者之间的协调通过一个规范的接口协议来解决。需要在页面里面加如一些标签,来生成动态内容,这一工作可以交由网页制作人员来完成。因为使用Velocity作为视图,由于他的语法、功能及使用方法都比较简单,因此一般情况下,一天以内就能让页面制作人员熟练掌握其用法。

二、Velocity基本语法

1、声明:#set ($var=XXX)

  左边可以是以下的内容

  Variable reference

  String literal

  Property reference

  Method reference

  Number literal #set ($i=1)

  ArrayList #set ($arr=["yt1","t2"])

  算术运算符

2、注释:

  单行## XXX

  多行#* xxx

      XXX*#

3变量 Variables

  以 "$" 开头,第一个字符必须为字母。character followed by a VTL Identifier. (a .. z or A .. Z).变量可以包含的字符有以下内容:

  alphabetic (a .. z, A .. Z)

  numeric (0 .. 9)

  hyphen ("-")

  underscore ("_")



4、属性Properties

  $Identifier.Identifier

  $user.name

  hashtable user中的的name值.类似:user.get("name")

5、方法Methods

  object user.getName() = $user.getName()

6、正规引用格式注意事项Formal Reference Notation


  用{}把变量名跟字符串分开,如

  #set ($user="csy"}

  ${user}name

  返回csyname

  $username

  $!username

  $与$!的区别

  当找不到username的时候,$username返回字符串"$username",而$!username返回空字符串""

7、双引号 与引号

  #set ($var="helo")

  test"$var" 返回testhello

  test'$var' 返回test'$var'

  可以通过设置 stringliterals.interpolate=false改变默认处理方式

8、条件语句

  #if( $foo )

   <strong>Velocity!</strong>

  #end

  #if($foo)

  #elseif()

  #else

  #end

  当$foo为null或为Boolean对象的false值执行.

9、逻辑运算符:== && || !

10、循环语句

#foreach($varin $arrays )

// 集合包含下面三种Vector, aHashtable or an Array

#end

  #foreach( $product in $allProducts )

   <li>$product</li>

  #end



  #foreach( $key in $allProducts.keySet() )

   <li>Key: $key -> Value: $allProducts.get($key)</li>

  #end



  #foreach( $customer in $customerList )

  <tr><td>$velocityCount</td><td>$customer.Name</td></tr>

#end

11、velocityCount变量在配置文件中定义

  # Default name of the loop counter

  # variable reference.

  directive.foreach.counter.name = velocityCount

  # Default starting value of the loop

  # counter variable reference.

  directive.foreach.counter.initial.value = 1

12、包含文件

  #include( "one.gif","two.txt","three.htm")

13、Parse导入脚本

  #parse("me.vm" )

14、#stop 停止执行并返回

15、定义宏Velocimacros ,相当于函数 支持包含功能


  #macro( d )

   <tr><td></td></tr>

  #end

  调用

  #d()

带参数的宏

  #macro( tablerows $color $somelist )

  #foreach( $something in $somelist )

   <tr><td bgcolor=$color>$something</td></tr>

  #end

  #end

16、范围操作符Range Operator

  #foreach( $foo in [1..5] )

17、"#"用来标识Velocity的脚本语句,包括#set、#if 、#else、#end、#foreach、#end、#iinclude、#parse、#macro等;

如:

#if($info.imgs)

<img src="$info.imgs" border=0>

#else

<img src="noPhoto.jpg">

#end

18、"$"用来标识一个对象(或理解为变量);

如:$i、$msg、$TagUtil.options(...)等。

19、"{}"用来明确标识Velocity变量;

比如在页面中,页面中有一个$someonename,此时,Velocity将把someonename作为变量名,若我们程序是想在someone这个变量的后面紧接着显示name字符,则上面的标签应该改成${someone}name。

20、"!"用来强制把不存在的变量显示为空白。

如当页面中包含$msg,如果msg对象有值,将显示msg的值,如果不存在msg对象同,则在页面中将显示$msg字符。这是我们不希望的,为了把不存在的变量或变量值为null的对象显示为空白,则只需要在变量名前加一个“!”号即可。如:$!msg

三、EasyJWeb建议

在界面模板中使用过多过复杂的脚本表达方式,在万不得已的情况下,不要在界面模板中加入任何复杂的逻辑,更不要在界面模板中加入变量声明、逻辑运算符等等。EasyJWeb提供了五条基本的模板脚本语句,基本上就能满足所有应用模板的要求。这四条模板语句很简单,可以直接由界面设计人员来添加。在当前很多EasyJWeb的应用实践中,我们看到,所有界面模板中归纳起来只有下面四种简单模板脚本语句即可实现:

1、$!obj  直接返回对象结果。

   如:在html标签中显示java对象msg的值。<p>$!msg</p>

  在html标签中显示经过HtmlUtil对象处理过后的msg对象的值  <p>$!HtmlUtil.doSomething($!msg)</p>

2、#if($!obj) #else#end 判断语句

   如:在EasyJWeb各种开源应用中,我们经常看到的用于弹出提示信息msg的例子。

   #if($msg)

   <script>

   alert('$!msg');

   </script>

   #end

  的脚本表示当对象msg对象存在时,输出<script>等后面的内容。

3、#foreach( $info in$list) $info.someList #end  循环读取集合list中的对象,并作相应的处理。

   如:EasyJF开源论坛系统中论(0.3)坛首页显示热门主题的html界面模板脚本:

  #foreach( $info in $hotList1)

<a href="/bbsdoc.ejf?easyJWebCommand=show&&cid=$!info.cid"target="_blank">$!info.title</a><br>

    #end

   上面的脚本表示循环遍历hotList1集合中的对象,并输出对象的相关内容。

4、#macro(macroName)#end 脚本函数(宏)调用,不推荐在界面模板中大量使用。

   如:在使用EasyJWebTools快速生成的添删改查示例中,可以点击列表的标题栏进行升降排序显示,这是我们在EasyJWeb应用中经常看到的一个排序状态显示的模板内容。

   函数(宏)定义,一般放在最前面,案例:

#macro(orderPic $type)

   #if ($orderField.equals($type))

   <imgsrc="http://images.cnblogs.com/ico/${orderType}.gif">

   #end

   #end

具体的调用如:<font color="#FFFFFF">头衔#orderPic("title")</font>

5、包含文件#inclue("模板文件名")或#parse("模板文件名")

  主要用于处理具有相同内容的页面,比如每个网站的顶部或尾部内容。如:#parse("/blog/top.html")或#include("/blog/top.html")

  parse与include的区别在于,若包含的文件中有Velocity脚本标签,将会进一步解析,而include将原样显示。

四、入门例子

Velocity应用于java工程时,创建完一个普通的java工程后,需要引入相应的jar包,才能让工程支持Velocity模板引擎(velocity-1.7.jar/commons-*.jar)

1.例子一:

VelJava工程的后台java代码`VelJava.java`

//构造函数

public VelJava() throws IOException{

//初始化Velocity模板

Velocity.init();

//创建一个VeloctiyContext对象

VelocityContext context=new VelocityContext();

//向VelocityContext对象中放入一个键值对

context.put("list", getNames());

Template template=null;

//通过静态方法获取一个模板

template=Velocity.getTemplate("test.vm");

//创建一个输出流

BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(System.out));

//将模板与context中的对象结合,然后输出

if(template!=null)

template.merge(context, writer);

//刷新缓存

writer.flush();

//关闭writer

writer.close();

}

//VelocityContext键值对中的值

public ArrayList<String> getNames(){

ArrayList<String> list=new ArrayList<String>();

list.add("element 1");

list.add("element 2");

list.add("element 3");

list.add("element 4");

return list;

}

备注

在这个例子中,以健值对的形式将getNames()函数的返回值存放在Velocity容器中,并给其一个键值为list

模板文件的代码如下test.vm:

##声明了一个变量

#set( $this = "ppTest")

##将变量打印出来

$this is great!

##对后台的list进行扫描,将集合中的元素一个一个的打印出来

#foreach( $name in $list )

$name is showed!

#end

##设置一个判断条件,将将判断条件赋值为真

#set( $condition = true)

##判断条件为真,执行

#if ($condition)

The condition is true!

##判断条件为假时,执行

#else

The condition is false!

#end

备注

其中的##表示的是注释

#set类表示的是预处理指令

$变量名表示声明的是一个变量

上面的代码注释的已经很清楚了,如果只是应用,不需要了解更多细节的话,上面的代码已经够了,从上面的代码中可以看出Velocity的一个好处就是模板文件与后台文件可以同步开发,只要约定好一些共有的变量定义即可,在模板输出时,由模板引擎进行变量的替换,替换之后再进行相应的输出

例子二:Velocity动态创建模板并渲染(Java工程)

演示了在Java工程将模板渲染后以指定的编码方式GBK输出,同时也演示了动态创建模板,然后进行渲染

public static void main(String[] args) {

//初始化Velocity引擎

Velocity.init();

//获取一个VelocityContext对象

VelocityContext context=new VelocityContext();

//向此对象容器中加入相应的键值对

context.put("name", "Velocity");

context.put("project", "Jakarta");

//StringWriter底层其实就是一个StringBuffer

StringWriter w=new StringWriter();

//将test2.vm与context进行合并,生成的最终代码写入StringWriter的buf中

Velocity.mergeTemplate("test2.vm", "GBK",context,w);

//将其在控制台上打印出来

System.out.println("模板:"+w);

//动态创建模板

String s="正在使用 $project $name 渲染模板";

w=new StringWriter();

/*

*context:对输入的字符串进行渲染

*w:渲染后的结果输出的地方

*mystring:发生错误时,被用来作为错误文件的名字

*s:包括VTL语言的输入字符串

*/

Velocity.evaluate(context, w, "mystring", s);

//将结果进行输出来

System.out.println(w);

}

例子二的模板文件test2.vm如下:

Hello 来自于 $name 在 $project 工程里.

例子二与例子一极为相似,例子二的模板只不过是在代码中创建的,例子一中的模板是直接引用外部的test.vm文件,从上面的代码中可以揣测一下Velocity是如何工作的,大概是这样的

1、将外部的vm文件读入内存

2、Velocity模板引擎对vm文件进行解析

3、解析之后对模板文件中的变量进行替换,并执行vm中的相应判断逻辑

4、执行完后,整个页面的渲染结果就知道了,再直接输出即可

从这里可以看出只要前后台代码的开发人员能够约定相同的变量,则前后台的开发完全可以并行执行

推荐文章:http://www.cnblogs.com/yasin/archive/2010/04/02/1703188.html

http://www.yanyulin.info/pages/2014/03/velocity_disabuse_1.html

Velocity脚本入门教程的更多相关文章

  1. Velocity脚本新手教程

    从网络下的数据汇编 一.Velocity简介 Velocity它是Apache该公司的开源产品,它是一套基于Java语言模板引擎,背景可以非常灵活的数据与模板文件一起反对.他直言不讳地说:,人使用模板 ...

  2. Velocity快速入门教程-脚本语法详解(转)

    1.变量 (1)变量的定义: #set($name = "hello")      说明:velocity中变量是弱类型的. 当使用#set 指令时,括在双引号中的字面字符串将解析 ...

  3. Linux shell 脚本入门教程+实例

    原文:http://www.wiquan.com/article/136 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是shell仍然是一个非常灵活的工具.She ...

  4. 简单的 Shell 脚本入门教程

    Shell脚本 运作方式与解释型语言相当,如果有语言基础,学起 Shell 脚本就非常容易,但是 Shell 与常见的语言不同,一些常见的函数在 Shell 中需要组合一些命令得以实现 工具推荐 Sh ...

  5. shell脚本入门教程(转)

    http://bbs.chinaunix.net/thread-391751-1-1.html http://www.cnblogs.com/suyang/archive/2008/05/18/120 ...

  6. linux的shell脚本入门

    Linux shell脚本入门教程 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活 的工具.Shell不仅仅是命令的收集,而且是一门非常 ...

  7. 脚本语言丨Batch入门教程第四章:调用与传参

    今天是Batch入门教程的最后一章内容:调用与传参.相信通过前面的学习,大家已经掌握了Windows Batch有关的基础知识和编程方法,以及利用Windows Batch建立初级的编程思维方式.今后 ...

  8. BAT脚本编写教程简单入门篇

    BAT脚本编写教程简单入门篇 批处理文件最常用的几个命令: echo表示显示此命令后的字符 echo on  表示在此语句后所有运行的命令都显示命令行本身 echo off 表示在此语句后所有运行的命 ...

  9. BAT脚本编写教程入门提高篇

    BAT脚本编写教程入门提高篇 批处理文件的参数 批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符“%”. %[1-9]表示参数,参数是指在运行批处理 ...

随机推荐

  1. MongoDB七-运维技术

    复制来自:http://www.cnblogs.com/huangxincheng/archive/2012/03/08/2384571.html 这一篇我们以管理员的视角来看mongodb,作为一名 ...

  2. 2016蓝桥杯省赛C/C++A组第六题 寒假作业

    题意:现在小学的数学题目也不是那么好玩的. 看看这个寒假作业: □ + □ = □ □ - □ = □ □ × □ = □ □ ÷ □ = □ 每个方块代表1~13中的某一个数字,但不能重复. 比如: ...

  3. LARGE_INTEGER 64位的输出格式

    %016I64x 第一个016是指当最左边无数据时用00填充:后面的I64x是__int64的前缀要求格式十六进制输出.

  4. Egret Engine 2D - 矢量绘图

      绘制矩形 drawRect 绘制矩形边 lineStyle( 10, 0x00ff00 清空绘图 clear 绘制园形 drawCircle 绘制直线 moveTo lineTo 绘制曲线 cur ...

  5. No enclosing instance of type test is accessible. Must qualify the allocation with an enclosing inst

    今日遇到一个报错如下: No enclosing instance of type test is accessible. Must qualify the allocation with an en ...

  6. Transaction Managament(事务管理二、Spring事务)

    Transaction Managament(事务管理二.Spring事务) Spring事务框架的优势 ​ Spring事务框架将开放过程中事务管理相关的关注点进行了分离,对这些关注点进行了抽象分离 ...

  7. delphi 串口的打开与关闭

    Delphi 打开串口与关闭串口 procedure TForm1.btn1Click(Sender: TObject); begin cm1.CommName:=cbb1.Text; cm1.Bau ...

  8. Maven:Eclipse导入从SVN上检出的Maven多模块工程

    大致步骤: 1.从SVN中检出多模块项目,名称随意(Eclipse中可以在[Window ==>>Show View==>>Other==>>SVN==>&g ...

  9. GRUB&MBR引导

    (ubuntu下搜索gnome-disk可以打开磁盘管理) 简单开机过程 : ①按下电源后,计算机自检(POST),如果硬件设备(CPU.内存.硬盘.光驱.各种卡)都没有问题,BIOS会检查各个硬盘的 ...

  10. 远程桌面,出现身份验证错误,要求的函数不正确,这可能是由于CredSSP加密Oracle修正

    问题点: 升级至win10 最新版本10.0.17134,安装最新补丁后无法远程win server 2016服务器,报错信息如下: 出现身份验证错误,要求的函数不正确,这可能是由于CredSSP加密 ...