一、什么是CommonTemplate?
CommonTemplate是一个开源的模板引擎,用于编译运行CTL模板语言,并且模板可以在Java,.Net,JS等中通用;
其主要目标是作为JSP,ASP.Net等页面技术的另一种选择方案,以保证用简单的语法,良好的结构,不混杂业务逻辑的方式书写页面;
适合于充当Model-View-Controller(MVC)模式应用的View角色,以使能更好的分离页面设计人员与业务开发人员的职责;
也可以作为动态文本生成工具,生成HTML、XML、Mail、Java源代码或其它文本等。
二、CommonTemplate有哪些特性?
1. 只有一个语法规则:$指令名{参数表达式},使用更简单,更统一。
2. 强大的调试器功能,支持模板指令单步执行,查错更方便。
3. 方便的查看器(exe程序),可在Windows下,双击*.ctl文件,直接生成.html文件,并自动用浏览器打开,方便于独立测试模板。
4. Eclipse模板编辑器插件,支持指令语法高亮,指令提示助手,指令折叠,错误指令检查及提示,指令大纲等。
5. 支持多语言(Java/C#.Net/JavaScript/C++),同一模板可以在不同的运行环境(JRE/CLR/Browser/CGI)上运行,使用JavaScript版可以将解析任务转移到客户端执行。(未全部完成)
6. 支持语法外套,可以在Dreamwear下正常使用WYSWYG(所见即所得编辑),并且语法外套是可扩展的。
7. 支持一等公民的动态宏指令(与标准指令同样的调用方式),更有利于模板组件化。
8. 支持模板继承,采用面向对象的多态思想,方便于页面Layout,比宏指令更灵活。
9. 支持JSP标签库适配,可用指令的方式调用JSP标签,如:$textfield{name:"",value:""}。
10. 内置的国际化支持,国际化信息处理更方便。
11. 完备的表达式支持,在全面兼容Java表达式的基础上,增加了更富表达力的操作符,包括BGGA闭包表达式等。
12. 禁止void函数调用,避免在模板中引入业务逻辑。(根据契约式设计原则,void函数通常是有副作用的,即修改状态)
13. 对已有的不可变类(String,Number,Date等),采用open class思想,允许在类的外部给类添加新的属性或方法,如:String本没有“首字母大写”的功能,可以外部给String注册一个 capitalize属性:${"james".capitalize}。(类似javascript的prototype)
14. 引擎采用微核设计理念,除了核心API及解析器外,其它如语言定义,资源管理等都是外置的,可以基于同一个引擎,设计另一套完全不同的模板语言。
15. 高度可扩展,平等对待标准包与第三方扩展,标准包所能实现的任何功能均可被替换
16. 使用主控迭代器模式替代传统的被动访问器模式,引擎只负责将模板解析成指令树,其它所有处理均由扩展指令自身完成,给扩展指令以最大的控制权。(类似于StAX与SAX的区别)
17. 多种优化措施,性能更优:
(1) 采用针对特定语法写的低级专有DFA解析器解析,试验表明比使用通用抽象的BNF语法体系解析(Java中一般用JavaCC或AntLR)要快,因为 BNF为了通用,考虑了太多因素,导致其效率降低,当然,BNF在处理复杂语法(比如要解析C/C++/Java等语法时)很有优势,但 CommonTemplate的语法非常简单且统一,所以使用专有的低级解析器是比较好的选择。
(2) 对常量进行编译期运算,如:表达式"2 + 3",将直接编译成"5"放入表达式树,避免在运行期重复计算,并且减小了表达式树的大小及内存占用。
(3) 解析结果被表示成一个线程安全(不变类级)的指令树,单个实例可以在多线程中任意重复使用,避免使用重复解析或克隆实例等性能损耗。
(4) 解析结果可以在内存中缓存起来,以减少解析次数及IO量,并且缓存策略是可扩展的。(已内置实现了NONE, STRONG, SOFT, WEAK, FIFO, LRU, MRU, OSCACHE, EHCACHE等缓存策略)
(5) 并且解析结果可以被序列化冻结,系统重启后,可以从冻结结果直接还原,不必再解析,也就是说模板只有第一次加载时才需要解析 (当然热加载时也会重新解析)。
18. 站在巨人的肩膀上,参考并借鉴了 WebMacro, Velocity, FreeMarker, JavaFX, OGNL, Perl6, Python/Django, PHP/Smarty, JavaScript/JSON, XML/XPath 等开源项目或规范,感谢它们做出的成果。
原文地址:http://www.commontemplate.org/zh/index.html 此文纯属个人收藏。 欢迎使用CommonTemplate 一、什么是CommonTemplate? CommonTemplate是一个易于扩展的开源模板引擎,用于编译运行CTL模板语言,并且模板可以在Java,.Net,JS等中通用; 其主要目标是作为JSP,ASP.Net等页面
不知道现在有多少人 正在/打算 使用 commontemplate,这个文章就算是与使用 commontemplate 的朋友的经验的分享吧! 这里主要说的是 commontemplate(以下简称 ct) 与 struts 结合的问题。 在 ct 的官方站点中有 struts 集成的例子,非常简单,首先是要有一个自己的 commontemplate.properties 了,里面有如下的配置:
经过多个版本的调整, CommonTemplate([url]http://www.commontemplate.org[/url])的核心包设计逐渐稳定. 但访问者的设计一直是块心病, 并且访问者是合成模式[GoF95]树结构中比较重要的扩展点. CommonTemplate中的访问者最开始设计: public interface Visitor { /** * 当访问到节点时被回调
CommonTemplate任务计划 基准版本:0.8.2 基准时间:2008-02-12 序号 任务描述 类型 1 异常国际化, 将所有异常信息用统一的工具类管理, 并配置到properties文件中. 优化 2 出错位置信息准确性, 当抛出异常时, 应显示准确的出错元素在模板中的行列位置, 并显示出错位置附件的模板内容. BUG 3 错误信息友好性, 抛出来的异常信息应有助于解决错误, 不应该
CommonTemplate发布0.8.4版本. 项目地址: [url]http://www.commontemplate.org[/url]此版本主要加强周边辅助工具的开发. 如: 调试器,查看器,编辑器等.其中编辑器功能未全部完成, 待下一版本继续实现. 更新日志:加强各DriectiveHandler的单元测试.修复不解释块"$! !$"状态机图的BUG, 并全面整理状态机图.采用Jeric
根据前几天的思考:[url]http://javatar.iteye.com/blog/139420[/url] CommonTemplate([url]http://www.commontemplate.org[/url])的配置方案确定, 采用全setter方式配置,以保持可以用任意IoC容器进行配置, 但为了不依赖于任何IoC容器使用组件, 在util包中实现了一个简单的BeanFactor
CommonTemplate: [url]http://www.commontemplate.org[/url] 问题来源: [url]http://javatar.iteye.com/blog/187669[/url] 解决方案: 在core包增加接口, 使外部构建树或表达式简化. 外部构建树或表达式通常分两种: 自顶向下: 也就是先创建父节点, 再压入子节点(通过栈的方式, 压入完所有子节点后
项目地址: [url]http://www.commontemplate.org[/url] 0.8.3 版本发布 (2008-03-30) 此版本新功能较少, 主要为加强测试与BUG修复. 将操作符类型重载处理方式从职责链模式改成配置分派模式. 加入数组格式化器, Object[].toString不再出现地址符, 相关配置: defaultArraySeparator=, 加入输出类型定义配置
此版本重构了side包的集成方案,将所有web集成统一用Listener进行初始化: <context-param> <param-name>commontemplate-config</param-name> <param-value> org/commontemplate/standard/commontemplate-standard.properties
模板引擎经常被用于做代码生成, 为此, CommonTemplate ([url]http://www.commontemplate.org[/url])将提供一个代码生成器, 方便使用. 周未完成了原型, 但主要功能都还没实现, 可能会在后一两个版本发布. 功能说明: 代码生器用于设计领域实体属性及关系,并通过CTL模板生成结构性代码。 通过配置在代码生器的工具栏上添加模板方案按钮(点击该按钮将
现在用Struts2的人开始多起来,为CommonTemplate([url]http://www.commontemplate.org/[/url])加了一个与Struts2的集成方案, Struts2([url]http://struts.apache.org/2.x/[/url])与Webwork一样,提供了模板输出hook, 所以集成是比较简单的,只需实现StrutsResultSuppo
今天非常感谢javatar能够抽空为我详细的讲解了整个CommonTemplate的设计细节以及使用。在不久的这段时间里,我将使Jwebap完全采用CommonTemplate来构建控制台和分析视图。 那么,为什么要采用模版引擎来实现分析视图呢?可以这么说,‘使用简便’一直是Jwebap极力追求的一项指标,包括在SQL分析插件里面,为了部署方便,Jwebap花了很多的力气实现Cla
项目地址: [url]http://www.commontemplate.org[/url] 增加JspTagLib适配器支持, 可以在CTL直接使用Jsp标签库。 增加对struts2(ui)标签库的配置, 参见下载列表中commontemplate-example.zip内的ct_struts2.war。 增加对SpringMVC的集成支持,参见下载列表中commontemplate-exam
CommonTemplate发布0.8.5版本(2008-08-04) 此版本主要完善核心引擎和标准指令集. 项目地址: [url]http://www.commontemplate.org[/url] Bug Fixed: 修复BeanUtils查找对象属性的BUG. 修复调试器变量树栈溢出BUG. 调试窗口在Tomcat下无效的BUG. 调试窗口变量树改为延迟加载方式(点击节点时加载其子节点)
CommonTemplate([url]http://www.commontemplate.org[/url])的 Debug单步跟踪初始版完成, 可下载每日构建版本试用. ([url]http://commontemplate.googlecode.com/svn/trunk/commontemplate/dist/[/url]) 将在后期TemplateEditor的eclipse插件中集成此
在元旦之夜发布了0.8.0 [url]http://www.commontemplate.org[/url] 增加了与struts及struts2的集成sample, (见下载列表中的commomtemplate-sample-0.8.0.zip) 将宏指令的特殊前缀语法去掉, 改成命名约定: 受FreeMarker影响, 它使用仿XML的: <@mymacro/> <@mymacro>...</
具体查看ejs官方文档 https://github.com/mde/ejs
我们自己实现了一个轻量级的模板引擎,不要问为什么不用smart之类的,因为我们认为没有必要为了一个小小的模板引擎而引入smaart这样复杂的实现。你可能会说,smart功能强大,支持各种标签,标签也是很强大,而且还可以对模板引擎进行各种"灵活"的配置... 这里我们觉得有必要说明一下: 框架的内置模板引擎基本上实现了我们日常开中所有常用的标签。 不常用的标签我们也做了巧妙的实现。 我们只提供了扩展
内置模板引擎 视图的模板文件可以支持不同的解析规则,默认情况下无需手动初始化模板引擎。 可以通过下面的几种方式对模板引擎进行初始化。 配置文件 内置模板引擎的参数统一在配置目录的template.php文件中配置,例如: return [ // 模板引擎类型 支持 php think 支持扩展 'type' => 'Think', // 模板路径 '
Warning: The packages listed below may be outdated, no longer maintained or even broken. Listing here does not constitute an endorsement or recommendation from the Expressjs project team. Use at your
Use the app.engine(ext, callback) method to create your own template engine. ext refers to the file extension, and callback is the template engine function, which accepts the following items as parame
hi-nginx-java内置了两个mustache模板引擎:mustache.java和jmustache。 以下介绍仅就jmustache而言。 字符串模板 字符串模板是最简单的情况。例如: package test; import hi.request; import hi.response; import hi.route; import java.util.regex.Matcher