http://velocity.apache.org/engine/releases/velocity-1.7/developer-guide.htmlhtml
1.行级注释##java
2.多行注释#* *#web
使用$开头的字符串是变量定义,例如$var1, $var2,apache
使用#set为变量赋值,例如数组
Java代码 session
1. #set指令须要使用小括号将赋值语句括起来架构
2. #set语句后面不要加“;”,不然;将解析到页面上app
3. #set是行级指令,不须要使用#endwebapp
假若有一个Velocity变量,例如$abc, 那么$abcdef这种串如何表达它的含义,即变量$abc的值链接def,默认Velocity会认为$abcdef是一个变量,此时须要使用${abc}def来表达它的含义。jsp
1. 运算符: + - * / %
2. 使用#set语句执行算术运算操做
Java代码
> >= == <= <
&& || !
Java代码
1. #if是条件判断语句,#if/#else, #if/#elseif/#else 是if/else条件判断语句
2. if/elseif使用括号括起来
3. #if是块级指令,所以使用#end显示指定块级指令的结束
Java代码
1. 数组定义相似于Javascript,用中括号[]括起来,以逗号分隔
2. $velocityCount是Velocity内置属性,用于指示当前循环的次数,从1开始计算,即第一次循环,它的值是1
3. #foreach in语句用于表示循环,
4. #foreach语句也是块级语句,须要使用#end来指明语句的结束
$!var1的含义是若是变量var1存在,则取其值,不然取空,即不显示,它等价于以下语句
Java代码
#include能够在vm中指定静态文件,这跟JSP的include标签的含义同样,例如
#include("staticHTML.html"),这个staticHTML.html
#include指令默认从classpath开始寻找文件??目前不肯定!
在#include指令一节说到了include的文件到什么位置进行加载,这个位置与velocity资源加载的配置有关,经常使用的加载位置包括 webapp资源加载器,文件路径资源加载器,还有类路径记载器,在velocity.properties中,添加以下的配置项表示webapp资源加 载器,项目对于web项目的根开始算起
Java代码
其中的webapp是资源加载器的名称,/vm是web应用的根下面的vm目录,也就是说,vm目录和WEB-INF目录是平级的
Velocity是一个基于java的模板引擎。它容许任何人仅仅简单的使用模板语言来引用由java代码定义的对象。
当Velocity应用于web开发时,界面设计人员能够和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员 能够只 关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提 供了便利,同时也为咱们在JSP和PHP以外又提供了一种可选的方案。
Velocity基本语法和使用:
1. "#"用来标识Velocity的脚本语句。
如:#set、#if 、#else、#foreach、#end、#include、#parse、#macro等。
2. "$"用来标识一个对象(或理解为PHP的变量)
如:、
user等。
3. "{}"用来明确标识Velocity变量,和普通模版字符串区分开来;
如:${user}‘s age 能够显示为 riqi's age。
4. "!"强制把不存在的变量显示为空白。
如:,假如对象为空,则模版中不显示该变量;若是缺乏,则显示
msg字符串,这是咱们不想要的结果。
5. 变量的定义和赋值。不须要指定变量的类型,相似弱类型语言PHP能够随意指定,在赋值后自动断定变量的类型,如:
#set($username="riqi") ##设置用户名
#set($age=26) ##设置年龄
6. 数组循环:
#foreach ($user in $users)
$!{user} $!{velocityCount} <br />
#end
能够是、或者,提供了获得循环次数的值:
velocityCount。
7. 语句注释:
单行注释:## 单行注释代码
多行注释:#* 多行注释代码 *#
8. 模版支持关系和逻辑操做符运算,如:&&、||、! 等
9. 宏定义:#macro ,相似PHP声明一个函数,其中有函数名称和参数列表。先定义再调用。
10. 终止命令:#stop,相似PHP的exit(); 中止执行模板引擎并返回。
11. 引入公共模版文件:#include与#parse,它们的差别是:
(1) 与#include不一样的是,#parse只能指定单个对象。而#include能够有多个
若是您须要引入多个文件,能够用逗号分隔就行:
#include ("one.gif", "two.txt", "three.htm" )
在括号内能够是文件名,可是更多的时候是使用变量的:
#include ( “greetings.txt”, $seasonalstock )
(2) #include被引入文件的内容将不会经过模板引擎解析;
而#parse引入的文件内容Velocity将解析其中的velocity语法并移交给模板,意思就是说至关与把引入的文件copy到文件中。
#parse是能够递归调用的。
12. 转义字符'\'.
这个和其它语言没有差别,假如:那么,表示输出
user字符串,\\$user表示输出\riqi。
13. Velocity内置了一部分java对象 如:、
response、$session等,在vm模版里能够直接调用。
------------------------------------------------------------------------------------
细节整理:
1. Velocity判断某个变量是否为空的方式:
1 |
#if($!变量名)……#else……#end |
或者:
1 |
#if("" == $!varName)……#else……#end |
Velocity出现的目的用于简化基于MVC的web应用开发,用于替代JSP标签技术,那么Velocity如何访问Java代码.本篇继续以Velocity三http://bit1129.iteye.com/blog/2106142中的例子为基础,
Java代码
Java代码
Java代码
Html代码
com.tom.servlets.UserService@48b4721b
$user.name
$user.getName()
tom
tom
$user.save()
1.能够经过Velocity将Java的对象注入到Context中,这样在vm中能够得到这个注入的Java对象,例子中调用了这个Java对象的toString方法
2.在vm中,仅仅能调用Java对象的带有String类型参数的方法,这是非性常巨大的局限,由于在vm中,无法像在JSP中经过<%%>建立Java对象,而后把它做为参数调用Java的方法
3.对于setter和getter,能够直接使用属性进行方法,例如$user.getName和$user.name是等价的,无论User类是否认义了name属性(好比把User类中的属性name更名为xname,getName和setName方法名不变)
4.$user.save()不能正确解析,也就是说,vm只能调用Java对象带String类型参数的方法(POJO的get方法除外)
Java代码
存放在classpath根目录下,内容:
Java代码
存放在{classpath根目录}/vm目录下。
Java代码
<?xml version="1.0" encoding="utf-8"?>
<T24 xmlns="http://www.temenos.com/T24/OFSML/130" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.temenos.com/T24/OFSML/130 ofsml13.xsd">
<ofsmlHeader>
<requestId>$_utils.uuid()$ofsRequest.getTxCode()</requestId>
<correlationId/>
</ofsmlHeader>
<serviceRequest>
<securityContext>
<userName>$ofsRequest.getName()</userName>
<password>$ofsRequest.getPassword()</password>
<company>$ofsRequest.getCompany()</company>
</securityContext>
<ofsStandardEnquiry name="$ofsRequest.getEnquiryName()">
#set($struct = $ofsRequest.getStruct)
#foreach ($item in $ofsRequest.getMessageData())
#if($_tools.isEmpty($struct) || $_tools.isNotEmpty($struct.get($item.getName())))
<selectionCriteria operand="$item.getOperator()">
<fieldName>$item.getName()</fieldName>
<value>#foreach($vItem in $item.getValue())$vItem #end</value>
</selectionCriteria>
#end
#end
</ofsStandardEnquiry>
</serviceRequest>
</T24>
// 组合请求消息报文对象
OFSEnquiryRequest ofsRequest = new OFSEnquiryRequest();
ofsRequest.setHeader(msgType + SPLIT_ROW + txCode);
ofsRequest.setName(name);
ofsRequest.setPassword(password);
ofsRequest.setCompany(company);
ofsRequest.setEnquiryName((String) msgHead.get("enquiryName"));
ofsRequest.setStruct(struct);
ofsRequest.setTxCode(txCode);
if (null != msgBody && msgBody.containsKey("messageData")) {
ofsRequest.setMessageData((List<OFSEnquiryReqItem>) msgBody.get("messageData"));
}
// 根据模板组合请求xml内容
VelocityContext ctx = new VelocityContext();
ctx.put("_tools", Tools.getInstance());
ctx.put("_utils", VelocityUtil.getInstance());
ctx.put("ofsRequest", ofsRequest);
String ofsmlEqyXml = "";
try {
// 变量REQ中保存了上面的模板内容
ofsmlEqyXml = VelocityHelper.getText(REQ, ctx);
} catch (Exception e) {
}
对于大部分的应用来讲,使用 FreeMarker 比 Velocity 更简单,由于 Velocity 还必须编写一些自定义的toolbox类以及一遍遍重复的编写一些比较通用的模版代码,所以也就丧失了刚开始开发时更多的宝贵时间。另外使用工具类和变通的方法在模版引擎中彷佛不是一个很是有效的作法。同时,Velocity 的作法使得在Velocity的模版中大量的跟 Java 对象进行交互,这违反了简单的原则,尽管你也能够将代码转入控制器中实现。固然,若是你像使用 Velocity 同样来使用 FreeMarker ,那么 FreeMarker 也能够跟 Velocity 同样简单。
Velocity 一个优于 FreeMarker 的地方在于它有很普遍的第三方支持以及一个很是庞大的用户社区,你能够经过这个社区得到到不少的帮助,相反的 FreeMarker 在这方面要差不少。固然,也有愈来愈多的第三方软件开始在支持 FreeMarker 。
velocity性能比freemarker好不少,应该是最好的,又看到说性能超过jsp。