Velocity语法(转)一、基本语法1、#用来标识Velocity的脚本语句,包括#set、#if、#else、#end、#foreach、#end、#iinclude、#parse、#macro等;如:#if($info.imgs)imgsrc=$info.imgsborder=0#elseimgsrc=noPhoto.jpg#end2、$用来标识一个对象(或理解为变量);如如:$i、$msg、$TagUtil.options(...)等。3、{}用来明确标识Velocity变量;比如在页面中,页面中有一个$someonename,此时,Velocity将把someonename作为变量名,若我们程序是想在someone这个变量的后面紧接着显示name字符,则上面的标签应该改成${someone}name。4、!用来强制把不存在的变量显示为空白。如当页面中包含$msg,如果msg对象有值,将显示msg的值,如果不存在msg对象同,则在页面中将显示$msg字符。这是我们不希望的,为了把不存在的变量或变量值为null的对象显示为空白,则只需要在变量名前加一个“!”号即可。如:$!msg二、在EasyJWeb中的最佳实践理论上你可以在EasyjWeb模板使用所有Velocity的脚本及功能,但我们不推荐你在界面模板中使用过多过复杂的脚本表达方式,在万不得已的情况下,不要在界面模板中加入任何复杂的逻辑,更不要在界面模板中加入变量声明、逻辑运算符等等。在EasyJWeb中,我们提供了五条基本的模板脚本语句,基本上就能满足所有应用模板的要求。这四条模板语句很简单,可以直接由界面设计人员来添加。在当前很多EasyJWeb的应用实践中,我们看到,所有界面模板中归纳起来只有下面四种简单模板脚本语句即可实现:1、$!obj直接返回对象结果。如:在html标签中显示java对象msg的值。p$!msg/p在html标签中显示经过HtmlUtil对象处理过后的msg对象的值p$!HtmlUtil.doSomething($!msg)/p2、#if($!obj)#else#end判断语句如:在EasyJWeb各种开源应用中,我们经常看到的用于弹出提示信息msg的例子。#if($msg)scriptalert('$!msg');/script#end上面的脚本表示当对象msg对象存在时,输出script等后面的内容。3、#foreach($infoin$list)$info.someList#end循环读取集合list中的对象,并作相应的处理。如:EasyJF开源论坛系统中论(0.3)坛首页显示热门主题的html界面模板脚本:#foreach($infoin$hotList1)ahref=/bbsdoc.ejf?easyJWebCommand=show&&cid=$!info.cidtarget=_blank$!info.title/abr#end上面的脚本表示循环遍历hotList1集合中的对象,并输出对象的相关内容。4、#macro(macroName)#end脚本函数(宏)调用,不推荐在界面模板中大量使用。如:在使用EasyJWebTools快速生成的添删改查示例中,可以点击列表的标题栏进行升降排序显示,这是我们在EasyJWeb应用中经常看到的一个排序状态显示的模板内容。函数(宏)定义,一般放在最前面#macro(orderPic$type)#if($orderField.equals($type))imgsrc={orderType}.gif#end#end具体的调用如:fontcolor=#FFFFFF头衔#orderPic(title)/font经过测试,宏不支持方法重载5、包含文件#inclue(模板文件名)或#parse(模板文件名)主要用于处理具有相同内容的页面,比如每个网站的顶部或尾部内容。使用方法,可以参考EasyJF开源Blog及EasyJF开源论坛中的应用!如:#parse(/blog/top.html)或#include(/blog/top.html)parse与include的区别在于,若包含的文件中有Velocity脚本标签,将会进一步解析,而include将原样显示。三、关于#set的使用在万不得已的时候,不要在页面视图自己声明Velocity脚本变量,也就是尽量少使用#set。有时候我们需要在页面中显示序号,而程序对象中又没有包含这个序号属性同,可以自己定义。如在一个循环体系中,如下所示:#set($i=0)#foreach($infoin$list)序号:$i#set($i=$i+1)#end四、Velocity脚本语法摘要1、声明:#set($var=XXX)左边可以是以下的内容VariablereferenceStringliteralPropertyreferenceMethodreferenceNumberliteral#set($i=1)ArrayList#set($arr=[yt1,t2])算术运算符2、注释:单行##XXX多行#*xxxxxxxxxxxxxxxxxxx*#References引用的类型3、变量Variables以$开头,第一个字符必须为字母。characterfollowedbyaVTLIdentifier.(a..zorA..Z).变量可以包含的字符有以下内容:alphabetic(a..z,A..Z)numeric(0..9)hyphen(-)underscore(_)4、Properties$Identifier.Identifier$user.namehashtableuser中的的name值.类似:user.get(name)5、Methodsobjectuser.getName()=$user.getName()6、FormalReferenceNotation用{}把变量名跟字符串分开如#set($user=csy}${user}name返回csyname$username$!username$与$!的区别当找不到username的时候,$username返回字符串$username,而$!username返回空字符串7、双引号与引号#set($var=helo)test$var返回testhellotest'$var'返回test'$var'可以通过设置stringliterals.interpolate=false改变默认处理方式8、条件语句#if($foo)strongVelocity!/strong#end#if($foo)#elseif()#else#end当$foo为null或为Boolean对象的false值执行.9、逻辑运算符:==&&||!10、循环语句#foreach($varin$arrays)//集合包含下面三种Vector,aHashtableoranArray#end#foreach($productin$allProducts)li$product/li#end#foreach($keyin$allProducts.keySet())liKey:$key-Value:$allProducts.get($key)/li#end#foreach($customerin$customerList)trtd$velocityCount/tdtd$customer.Name/td/tr#end11、velocityCount变量在配置文件中定义#Defaultnameoftheloopcounter#variablereference.directive.foreach.counter.name=velocityCount#Defaultstartingvalueoftheloop#countervariablereference.directive.foreach.counter.initial.value=112、包含文件#include(one.gif,two.txt,three.htm)13、Parse导入脚本#parse(me.vm)14、#stop停止执行并返回15、定义宏Velocimacros,相当于函数支持包含功能#macro(d)trtd/td/tr#end调用#d()16、带参数的宏#macro(tablerows$color$somelist)#foreach($somethingin$somelist)trtdbgcolor=$color$something/td/tr#end#end17、RangeOperator#foreach($fooin[1..5])附:《浅析MVC框架中View层的优雅设计及实例》作者:EasyJF开源团队大峡在基于B/S的应用程序开发中,从基本的技术分工上来说就是两大块,一是软件显示界面,另一个是程序逻辑。在N年前的脚本语言时代,无论是asp、php还是jsp,我们基本是都是把这两者柔和在一起的。尽管我们想方设法做好很多函数或者包含文件来努力达到软件的复用,但仍然无法满足多变的用户需求,这主要是因为以前的纯脚本编码方式无法很好支持及应用面向对象(OO)领域中的强大功能。在常见的B/S软件项目中,界面的设计包括html界面、Wap界面及其它由文本字符协议为基本表示的界面等。以我们接触最多的html页面为例子,在做这些界面的时候往往需要美工先使用photoshop或fireworks等图形界面设计工具进行全局设计,然后再使用进行Dreamweaver等html页面制作工具进行加工制作。而强大的程序逻辑及后台处理都是由服务器端程序完成,这些程序具有较高的稳定性,其开发工具如JBuilder、Eclipse等对View层的界面无法很好的支持(当然那些用记事本写界面的应用除外),这就使得很多MVC框架的设计都无法两全齐美。作位一个比较友好的MVC的框架,在简化服务器应用开发的同时,还需要在View这一层设计上不要过多的影响到界面人员的工作,最基本的要求就是不要过多的加入一些设计软件不支持的标签等元素(如Struts的很多标签在Dreamweaver中都不支持)。这里我们以EasyJWeb为例,探讨在View层如何实现比较合理的设计。EasyJWeb作为一个快速JavaWebMVC框架,其设计目标不尽是要简化软件开发人员的代码书写工作,更是要能方便界面设计人员的工作。当然,要使界面能跟后台程序逻辑能融合,显示界面及程序逻辑之间需要一定的对话协议在所难免。EasyJWeb作为一个MVC框架,同样也存在着这样的对话协议,这就是EasyJWeb中的界面模板标识语言。在当前发布的版本中,EasyJWeb界面模板标识语言使用的是Apache开源的Velocity模板引擎(templateengine),当然以后会根据际需要加入更多的模板引擎以供框架应用者选择。Velocity是一个基于java的模板引擎(templateengine),它允许任何人仅仅简单的使用模板语言(templatelanguage)来引用由java代码定义的对象。作为一个比较完善的模板引擎,Velocity的功能是比较强大的,但强大的同时也增加了应用复杂性。理论上你可以在EasyjWeb模板使用所有Velocity的脚本及功能,但我们不推荐你在界面模板中使用过多过复杂的脚本表达方式,在万不得已的情况下,不要在界面模板中加入任何复杂的逻辑,更不要在界面模板中加入变量声明、逻辑运算符等等。在EasyJWeb中,我们提供了四条基本的模板脚本语句,基本上就能满足所有应用模板的要求。这四条模板语句很简单,可以直接由界面设计人员来添加。在当前很多EasyJWeb的应用实践中,我们看到,所有界面模板中归纳起来只有下面四种简单模板脚本语句即