TinyTemplate(Velocity Plus版)即将火热推出

本来是没有自己写一个模板引擎的计划的,因为按我的理解,一直认识这种“语言”级的引擎,难度是非常大的。总感觉自己的水平不够,因此不敢有这个念头。直到大量使用Velocty的时候,碰到velocty诸多尽如人意的地方,但是又无能为力,退回到JSP吧,又心不有甘。于是就期望着寻找一种语法结构接近velocty,但是又没有Velocity这些不方便之处的模板语言。于是进到一个模板语言群,一群大佬们个个至少是一个模板语言的作者,于是作者在里面表达了自己的期望,大佬们都介绍了自己的模板引擎,于是作者一个接一个的看源码,看文档。说实际,看文档,感觉都非常不错,都有自己的特色,看语法也都不错,除了一部分自己特别关注的点没有之外,其部分都非常不错了。但是距离自己的诉求还是有差距,怎么办呢?于是就准备找一个最接近的模板引擎来进行一定的扩展,挑来挑去就挑中了jetbrick这个模板语言(在此对Jetbrick致以强烈的衷心的感谢!!)。
之所以挑这个呢,是因为以下几个原因:

  • Antlr语言文件编写非常清晰,对于我这种Antlr盲来说,也可以看得懂,甚至可以照葫芦画瓢修改修改,这个非常重要,在后期作者进行了相当的语法改进,这个方面有极度体现
  • 代码质量较好,使用sonar进行进行分析,给的结果都还是相当不错的,在作者看过的所有的模板语言中,算上成之选
  • 语法结构与Velocity的非常接近,这点对我也非常重要,因为我的想法就是velocity语法有相当的接受度,与Velocity语法接近,velocity的一些使用者可以方便的进行切换
  • 测试用例比较完善,当时也就是这么一看,但是最后Tiny模板引擎完成之后,利用其测试用例进行测试发现了好几个BUG,说明还是非常有效果的

于是下载了源码,初端详还是不错的,但是在实现在几点和笔记诉求有差距:
第一我希望是弱类型,jetbrick是强类型,性能是有提高但是开发过程会比较不方便。
另外由于jetbrick作者期望在编译器进行强类型推测,因此导致运行期的内容与编译期的内容有比较强的耦合。
另外有一些语言特性,属于个人爱好上的原因,也有一些差异,因此就决定自己编写一个。

语法规范为了更好的说明Tiny的语法规范,因此全程对比Velocity
说明,<>中的内容表示必须有至少一个,[]中的内容表示可以有可以没有。References表达式${表达式}
表达式是指最后的运算结果是一个值,表达式中可以使用变量
=>与Velocity区别,这里大括号必须有,不能省略,“-”号不允许出现
${a+b-c+d}
${"abc"+1}
${user.name}
${user.items[1].count+3}
${user.func(1,2,3,4)+map.def+map["aa"]}
变量
<a->[_a-zA-z0-9]
=>与Velocity区别,“-”号不允许出现
示例:
合法

  • abc
  • ab_c
  • Ab9_

非法

  • 9bc
  • _bc
  • a-b

属性值属性语法与变量名一样
区别大括号必须有,“-”号不可以有
属性值实际上也是个表达式,因此这么写也是可以的
${a.("aa"+bb)},如果bb的值为3,则等同于${a.aa3},等同于a."aa3"
指令#set - 赋值指令Format:
#set ( ref = [ " ]arg[ " ] )
示例
#{set}不被支持
变量名前面不可以加$
#set(aa=1)
#set(aa=2,b=2,c=aa+2,d=func("info"))
#set(aa=[aa,"bb",2,3,4]
#set(aa={"aa":1,bb:2,aa.bb.func()+3:5}
#if/#elseif/#else - 判断语句格式:
#if( [condition] ) [output] [ #elseif( [condition] ) [output] ]* [ # [ { ] else [ } ] [output] ] # [ { ] end [ } ]
用法:
#if(aa)
#end
#if(aa||bb)
#end
这里即可以是逻辑表达式,也可以是非逻辑表达式
情况如下:
如果是null,则false
如果是boolean值,看true/false
如果是String,看长度>0
如果是Collection,看Size>0
如果是Iterator看hasNext
如果是数组,看长度>0
如果是Enumerator,看hasMoreElements
如果是Map看size
其它情况,就返回true
下面所有的逻辑表达式都支持
Operator Name   
Symbol    
Alternative Symbol    
Example
Equals Number   
==    
eq    
#if( $foo == 42 )
Equals String   
==    
eq    
#if( $foo == "bar" )
Object Equivalence   
==    
eq    
#if( $foo == $bar )
Not Equals   
!=    
ne    
#if( $foo != $bar )
Greater Than   
>     
gt    
#if( $foo > 42 )
Less Than   
<     
lt    
#if( $foo < 42 )
Greater Than or Equal To   
> =    
ge    
#if( $foo >= 42 )
Less Than or Equal To   
< =    
le    
#if( $foo <= 42 )
Boolean NOT   
!    
not    
#if( !$foo )
Notes:

  • ==用的是equals
  • 可以用下面的方式来避免与显示内容分不开

#if(foo == bar)it‘s true!#{else}it‘s not!#end</li>
注意:与Velocity区别:变量名前面不要加“$”符号
#for - for循环指令Format:
# for(varName : collection) 显示内容1 [#[{]else[}] ]  显示内容2 # [ { ] end [ } ]
表示对集合进行循环,执行显示内容1,如果集合为空,则执行显示内容2
注意:与Velocity区别:增了了#else指令
可以是collection的内容:
数组、集合、Iterator,Enumeration,Map,对象,甚至null
如果不是集合对象,只是一个普通对象,就只循环次,这比较适合于有时候会返回列表,有时候会返回一个对象的情况,就避免了增加复杂的判断。
#include - 包含指令Format:
#include(expression[,{aa:1,bb:2}])
示例:
#include("/aa/bb/cc.vm")
#include("/aa/bb/cc.vm")
与Velocity的区别:用于把另外的页面在当前位置进行渲染,后面只能加一个Map用来传递参数
#parse:指令已经没有意义被取消#stop - Stops the template engineFormat:
#stop[(expresson)]
Usage:
#if(aa==bb)
#stop
#end
等价于
#stop(aa==bb)
#break - Stops the current directiveFormat:
#break[(expresson)]
Usage:
#if(aa==bb)
#break
#end
等价于
#break(aa==bb)
#continue[(expresson)]
Usage:
#if(aa==bb)
#continue
#end
等价于
#continue(aa==bb)
#evaluate - Dynamically evaluates a string or reference由于难用被取消,且用处太小被取消增加指令#[@]call
#call("aa"+"bb",1,2)
等同于
#aabb(1,2)
#call(format("Sys%sMdl%s",1,2),1,2)
等同于
#Sys1Mdl2(1,2)
#@call("aa"+"bb",1,2)
...
#end
等同于
#@aabb(1,2)
...
#end
#@call(format("Sys%sMdl%s",1,2),1,2)
...
#end
等同于
#@Sys1Mdl2(1,2
...
#end
另外支持命名传递,详见宏调用
#define - 由于鸡肋被取消,调用者中的所有变量对于被调用者都可见,不再需要显式传递#macro - 定义宏Format:
# macro macroName( arg1 [, arg2,arg3 ... argn ] ) [ VM VTL code... ] # [ { ] end [ } ]
与 Velocity不同:macroName由括号里放在了括号外面,避免与参数混一起,参数之间必须用逗号隔开
调用宏有两种方式
#vmname( arg1,arg2 )
#@vmname(arg1,args)
....
#end
与Velocity不同:支持命名调用:
比如下面的方式; #vmname(arg2=3),也可以混用:#vmname(1,2,arg5=3,arg4=4)
注释:
##单行注释
#-- ... --#  #* ... *#,两种格式支持,是考虑到在<!-- -->的时候,改成#-- --#更方便

非解析标记,下面的内容会原样输出
#[[
This has invalid syntax that would normally need "poor man‘s escaping" like:

    • #define()
  • ${blah

]]#

新增加内容:i18n支持:
$${aaa.bbb.ccc}

表示显示aaa.bbb.ccc对应的国际化内容
当然,还有强大的布局(页面继承),容易的使用(会vm的到现在已经会用),方便的扩展(非常容易扩展),微小的体量(引擎只有2000行代码),还想要什么,可以尽情提出。
新增内容:Java对象方法扩展,即在不修改原类的情况下,对java类添加
比如可以为String增加bold函数,通过下面的方式来进行加粗
${“悠然是个好同志”.bold()}
也可以给 Object增加toJson,toXml等方法,从而直接用下面的方式输出json或xml:
${user.toJson()},${user.toXml()}
当然,现在还有一点计划中的特性没有实现,那就是装饰方式的布局方式,可能有些同学不了解,那就先留点悬念吧。

时间: 2024-10-09 04:57:17

TinyTemplate(Velocity Plus版)即将火热推出的相关文章

蓝缘管理系统第三版即将推出。springMVC4.0+shiro1.2.3+spring4.x+Mybaits3.2.8

本系统中主要使用了springMVC4.0+shiro1.2.3+spring4.x+Mybaits3.2.8+Ajax+html5等技术.以及大体兼容手机和Ipad浏览器,方便外出管理!. 由于前段时间太忙了,所以有很长一段时间搁置了没有处理系统,一直推到现在还没有完善好.不过也快,本系统纯属是业余爱好,当然不能与专业系统相比较的! 好了,大家先浏览一下之前的二个版本,欢迎各种吐蕃!记得猛顶一下哦! 1.0版本:http://blog.csdn.net/mmm333zzz/article/de

Tiny框架2.0版火热推出

方法论 方法论决定了可以达到的高度 方法论,就是人们认识世界.改造世界的根本方法. 它是人们用什么样的方式.方法来观察事物和处理问题.概括地说,世界观主要解决世界"是什么"的问题,方法论主要解决"怎么办"的问题. 方法论是一种以解决问题为目标的体系或系统,通常涉及对问题阶段.任务.工具.方法技巧的论述.方法论会对一系列具体的方法进行分析研究.系统总结并最终提出较为一般性的原则. 方法论也是一个哲学概念.人们关于"世界是什么.怎么样"的根本观点是世

《循序渐进Linux》第二版即将出版发行(附封面)

从<循序渐进Linux>第一版发布,到现在已经近6年了,6年的时间,技术发生了很大的变化,Linux系统的内核版本从2.6.9(RHEL4.x)已经更新到了现在的3.10(Centos7.x),第一版中的部分内容已经陈旧,Linux系统部分运行机制也发生了很大变化,为了适应技术发展潮流,也为了所有支持这本书的读者,我决定重新修订本书,推出<循序渐进Linux>第二版.第二版基本继承了第一版中的内容结构,基本以Redhat Linux.Centos两个Linux发行版为主进行介绍,采

(转)重磅出击:MongoDB 3.0正式版即将发布

MongoDB 今天宣布 3.0 正式版本即将发布.这标志着 MongoDB 数据库进入了一个全新的发展阶段,提供强大.灵活而且易于管理的数据库管理系统. MongoDB 3.0 在性能和伸缩性方面都有非常巨大的提升,通过在存储层的大幅改进实现.内建 WiredTiger 存储引擎,这是一项难以置信的技术实现,提供无门闩.非堵塞算法来利用先进的硬件平台(如大容量芯片缓存和线程化架构)来提升性能.通过 WiredTiger ,MongoDB 3.0 实现了文档级别的并发控制,因此大幅提升了大并发下

Win10 Mobile一周年更新正式版即将推送,但对部分机型来说不是好消息

微软将在9月30日推送Win10一周年更新正式版,包括Win10 Mobile,将面向现有的Win10手机用户推送,不过按照年度更新预览版情况看,一部分机型将无法获得Win10 Mobile红石正式版更新. 在今年早些时候,所有的Windows Phone 8.1 Lumia手机和其他WP机型都可以通过Windows Insider计划获得Win10 Mobile更新,并且可以获得持续更新. 但是当博狗发布首个Win10 Mobile正式版之后,一些旧的WP8.1机型快速通道被限制,不能接收到最

Zabbix企业级分布式监控系统第2版即将出版

经过近一年的写作,博主的Zabbix第二本书籍也写完,目前在出版社编辑中,全书的目录结构如图所示. 原文地址:http://blog.51cto.com/itnihao/2314275

微信电视2.0版将新增语音搜索、节目单分享推荐自定义等

继腾讯推出微信电视以来,微信传屏.微信弹幕.微信遥控等基于腾讯微信平台的电视功能一直受到市场追捧,现在微信电视2.0版即将到来了,瞧瞧将会有哪些新的特色功能吧 昨天(13日),TCL集团在深圳举办“双+”战略转型阶段性进展发布会,TCL多媒体CEO郝义向外界透露了微信电视2.0版的最新进展.据悉,TCL自联合腾讯推出微信电视后一直受到市场追捧.截至2014年10月底,激活微信功能的TV+智能电 视已超过5.1万台,绑定微信账号超过7.5万个,微信电视的运营价值也得到初步显现.微信电视2.0版还将

钉钉电脑版|阿里钉钉电脑版下载

很上心地使用测试了两天钉钉.总体感觉是,有些小问题,但瑕不掩瑜.钉钉的通话效果很好,没有一度遭网友诟病的语音延迟现象,也许以前有,现在修复了.但今天试用时发现了严重的拨号延迟现象.钉钉电脑版下载链接软件介绍钉钉电脑版是阿里巴巴推出的一款能在各平台协同使用的聊天工具,如今很多企业都用它来进行商务沟通和工作合作,因为该软件内置每日总结.工作计划.位置查询.公司通讯录等商务功能,还具备通话.团队组建.企业群等能快速搭建企业内部的交流功能,这些功能更是微信和qq无法替代的,自从2014年阿里钉钉问世以来

支付宝生活圈即将上线

在移动互联网高速发展的今天,移动支付已经变成了很多朋友的日常首选支付方式了,正是顺着这个趋势,支付宝9.0加入“朋友”一级入口的时候,很多的朋友已经预想到了支付宝可能要和微信一下有自己的圈子,所以支付宝就是在这种情况下,即将的推出生活圈. 支付宝和微信一样有自己的圈子,难道支付宝也要做社交了吗? 其实在新霸哥看来,新霸哥不看好支付宝做社交,因为这不是支付宝要做的事情,社交应该是社交软件做的事情,人们使用最多的就是微信了. 支付宝我们使用最多的就是为了支付,生活中,我们使用最多的支付工具,就是支付