Velocity 是一个基于 java 的模板引擎(template engine)。它容许任何人仅仅简单的使用模板语言(template language)来引用由 java 代码定义的对象。javascript
当 Velocity 应用于 web 开发时, 界面设计人员能够和 java 程序开发人员同步开发一个遵循 MVC 架构的 web 站点,也就是说,页面设计人员能够只关注页面的显示效果,而由 java 程序开发人员关注业务逻辑编码。Velocity 将 java 代码从 web页面中分离出来,这样为 web 站点的长期维护提供了便利,同时也为咱们在 JSP以外又提供了一种可选的方案。php
Velocity 的能力远不止 web 站点开发这个领域,例如,它能够从模板(template)产生 SQL 和 PostScript、XML,它也能够被看成一个独立工具来产生源代码和报告, 或者做为其余系统的集成组件使用。Velocity 也能够为 Turbine web开发架构提供模板服务(template service)。Velocity+Turbine 提供一个模板服务的方式容许一个 web 应用以一个真正的 MVC 模型进行开发。css
1、基本语法html
一、"#"用来标识Velocity的脚本语句,包括#set、#if 、#else、#end、#foreach、#end、#iinclude、#parse、#macro等;
如:
#if($info.imgs)
<img src="$info.imgs" border=0>
#else
<img src="noPhoto.jpg">
#endjava
二、"$"用来标识一个对象(或理解为变量);如
如:$i、$msg、$TagUtil.options(...)等。web
三、"{}"用来明确标识Velocity变量;
好比在页面中,页面中有一个$someonename,此时,Velocity将把someonename做为变量名,若咱们程序是想在someone这个变量的后面紧接着显示name字符,则上面的标签应该改为${someone}name。服务器
四、"!"用来强制把不存在的变量显示为空白。
如当页面中包含$msg,若是msg对象有值,将显示msg的值,若是不存在msg对象同,则在页面中将显示$msg字符。这是咱们不但愿的,为了把不存在的变量或变量值为null的对象显示为空白,则只须要在变量名前加一个“!”号便可。
如:$!msg架构
2、在EasyJWeb中的最佳实践框架
理论上你能够在EasyjWeb模板使用全部Velocity的脚本及功能,但咱们不推荐你在界面模板中使用过多过复杂的脚本表达方式,在万不得已的状况下,不要在界面模板中加入任何复杂的逻辑,更不要在界面模板中加入变量声明、逻辑运算符等等。
在EasyJWeb中,咱们提供了五条基本的模板脚本语句,基本上就能知足全部应用模板的要求。这四条模板语句很简单,能够直接由界面设计人员来添加。在当前不少EasyJWeb的应用实践中,咱们看到,全部界面模板中概括起来只有下面四种简单模板脚本语句便可实现:
一、$!obj 直接返回对象结果。
如:在html标签中显示java对象msg的值。<p>$!msg</p>
在html标签中显示通过HtmlUtil对象处理事后的msg对象的值 <p>$!HtmlUtil.doSomething($!msg)</p>jsp
二、#if($!obj) #else #end 判断语句
如:在EasyJWeb各类开源应用中,咱们常常看到的用于弹出提示信息msg的例子。
#if($msg)
<script>
alert('$!msg');
</script>
#end
上面的脚本表示当对象msg对象存在时,输出<script>等后面的内容。
三、#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集合中的对象,并输出对象的相关内容。
四、#macro(macroName)#end 脚本函数(宏)调用,不推荐在界面模板中大量使用。
如:在使用EasyJWeb Tools快速生成的添删改查示例中,能够点击列表的标题栏进行升降排序显示,这是咱们在EasyJWeb应用中常常看到的一个排序状态显示的模板内容。
函数(宏)定义,通常放在最前面
#macro(orderPic $type)
#if ($orderField.equals($type))
<img src="http://images.cnblogs.com/ico/${orderType}.gif">
#end
#end
具体的调用如:<font color="#FFFFFF">头衔#orderPic("title")</font>
五、包含文件#inclue("模板文件名")或#parse("模板文件名")
主要用于处理具备相同内容的页面,好比每一个网站的顶部或尾部内容。
使用方法,能够参考EasyJF开源Blog及EasyJF开源论坛中的应用!
如:#parse("/blog/top.html")或#include("/blog/top.html")
parse与include的区别在于,若包含的文件中有Velocity脚本标签,将会进一步解析,而include将原样显示。
3、关于#set的使用
在万不得已的时候,不要在页面视图本身声明Velocity脚本变量,也就是尽可能少使用#set。有时候咱们须要在页面中显示序号,而程序对象中又没有包含这个序号属性同,能够本身定义。如在一个循环体系中,以下所示:
#set ($i=0)
#foreach($info in $list)
序号:$i
#set($i=$i+1)
#end
4、Velocity脚本语法摘要
一、声明:#set ($var=XXX)
左边能够是如下的内容
Variable reference
String literal
Property reference
Method reference
Number literal #set ($i=1)
ArrayList #set ($arr=["yt1","t2"])
算术运算符
二、注释:
单行## XXX
多行#* xxx
xxxx
xxxxxxxxxxxx*#
References 引用的类型
三、变量 Variables
以 "$" 开头,第一个字符必须为字母。character followed by a VTL Identifier. (a .. z or A .. Z).
变量能够包含的字符有如下内容:
alphabetic (a .. z, A .. Z)
numeric (0 .. 9)
hyphen ("-")
underscore ("_")
四、Properties
$Identifier.Identifier
$user.name
hashtable user中的的name值.相似:user.get("name")
五、Methods
object user.getName() = $user.getName()
六、Formal Reference Notation
用{}把变量名跟字符串分开
如
#set ($user="csy"}
${user}name
返回csyname
$username
$!username
$与$!的区别
当找不到username的时候,$username返回字符串"$username",而$!username返回空字符串""
七、双引号 与 引号
#set ($var="helo")
test"$var" 返回testhello
test'$var' 返回test'$var'
能够经过设置 stringliterals.interpolate=false改变默认处理方式
八、条件语句
#if( $foo )
<strong>Velocity!</strong>
#end
#if($foo)
#elseif()
#else
#end
当$foo为null或为Boolean对象的false值执行.
九、逻辑运算符:== && || !
十、循环语句#foreach($var in $arrays ) // 集合包含下面三种Vector, a Hashtable 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
十一、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
十二、包含文件
#include( "one.gif","two.txt","three.htm" )
1三、Parse导入脚本
#parse("me.vm" )
1四、#stop 中止执行并返回
1五、定义宏Velocimacros ,至关于函数 支持包含功能
#macro( d )
<tr><td></td></tr>
#end
调用
#d()
1六、带参数的宏
#macro( tablerows $color $somelist )
#foreach( $something in $somelist )
<tr><td bgcolor=$color>$something</td></tr>
#end
#end
1七、Range Operator
#foreach( $foo in [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做为一个快速Java Web MVC框架,其设计目标不满是要简化软件开发人员的代码书写工做,更是要能方便界面设计人员的工做。
固然,要使界面能跟后台程序逻辑能融合,显示界面及程序逻辑之间须要必定的对话协议在所不免。EasyJWeb做为一个MVC框架,一样也存在着这样的对话协议,这就是EasyJWeb中的界面模板标识语言。
在当前发布的版本中,EasyJWeb界面模板标识语言使用的是Apache开源的Velocity模板引擎(template engine),固然之后会根据际须要加入更多的模板引擎以供框架应用者选择。
Velocity是一个基于java的模板引擎(template engine),它容许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。做为一个比较完善的模板引擎,Velocity的功能是比较强大的,但强大的同时也增长了应用复杂 性。
理论上你能够在EasyjWeb模板使用全部Velocity的脚本及功能,但咱们不推荐你在界面模板中使用过多过复杂的脚本表达方式,在万不得已的状况下,不要在界面模板中加入任何复杂的逻辑,更不要在界面模板中加入变量声明、逻辑运算符等等。
在EasyJWeb中,咱们提供了四条基本的模板脚本语句,基本上就能知足全部应用模板的要求。这四条模板语句很简单,能够直接由界面设计人员来添加。在当前不少EasyJWeb的应用实践中,咱们看到,全部界面模板中概括起来只有下面四种简单模板脚本语句便可实现:
一、$!obj 直接返回对象结果。
如:在html标签中显示java对象msg的值。<p>$!msg</p>
在html标签中显示通过HtmlUtil对象处理事后的msg对象的值.<p>$!HtmlUtil.doSomething($!msg)</p>
二、#if($!obj) #else #end 判断语句
如:在EasyJWeb各类开源应用中,咱们常常看到的用于弹出提示信息msg的例子。
#if($msg)
<script>
alert('$!msg');
</script>
#end
上面的脚本表示当对象msg对象存在时,输出<script>等后面的内容。
三、#foreach( $info in $list) $info.something #end 循环读取集合list中的对象,并做相应的处理。
如:EasyJF开源论坛系统中论坛首页显示热门主题的html界面模板脚本
#foreach( $info in $hotList1)
<a href="/bbsdoc.ejf?easyJWebCommand=show&&cid=$!info.cid" target="_blank">$!info.title</a><br>
#end
上面的脚本表示循环遍历hotList1集合中的对象,并输出对象的相关内容。
四、#macro(macroName)#end 脚本函数(宏)调用,不推荐在界面模板中大量使用。
如:在EasyJF简易订销管等系统中常常看到的一个排序状态显示的模板内容。
函数(宏)定义,通常放在最前面
#macro(orderPic $type)
#if ($orderField.equals($type))
<img src="http://images.cnblogs.com/ico/${orderType}.gif">
#end
#end
具体的调用如:<font color="#FFFFFF">头衔#orderPic("title")</font>
总结:
固然,在实际应用项目中,为了实现界面的更加友好、人性化,会出现不少复、易变的需求。如根据对象的不一样状态,显示不一样的提示颜色、提示语音等功能。在这 种时候,仍然要慎用太多的模板脚本功能,大多数需求均可以经过变通的方式解决,有些信息能够直接在对象中增长逻辑转化信息,有些界面要求能够经过在界面中 使用与特定界面有关的表达方式来实现,如html页面中使用javascript、css,Wap页面中使用WMLScript等等。只有,这样才能确保 证你的系统核心不受界面的的影响及控制,才能更好的扩展及维护。
咱们但愿你能成为真正的程序高手,而不仅是精通某个处于表层的脚本语言,所以也不但愿广大Java开发人员在View层消耗太多的时间。
因为水平有限,本文所谈的内容有N多不合理或者须要改进的地方,恳请你们指正!
附:EasyJWeb简介
EasyJWeb是基于java技术,应用于WEB应用程序快速开发的MVC框架,框架设计构思来源于国内众多项目实践,充分借签了当前主流的开源 Web框架(Struts、JSF、Tapestry 、Webwork等),吸收了其优势及精华,利用Velocity做为模板页面引擎,是一个实现了页面及代码彻底分离的MVC开发框架,是一个旨在于为中 小型Web应用系统提供快速开发实践的简易Web框架。
EasyJF开源团队于2006年初才开始建设,所以当前整个开发团队组建以及所发布的做品,都显得极不成熟。EasyJWeb仍然处于测试阶段,请广大的Java爱好者多多批评及建议,同时也很是欢迎您能加入到咱们的国产开源队伍中。
EasyJWeb官方网址:www.easyjf.comEasyJF团队官方网址:www.easyjf.com