Tapestry 5.2.4下载地址发布了,同时Tapestry 5.2.4也是作为Tapestry 5.2正式版的第一个发布版本,关注Tapestry 5.2的朋友可以直接去Tapestry官方获取最新的Tapestry 5.2.4下载地址下载试用。作为Tapestry的忠实用户和一个使用Tapestry将近5个年头的开发者来说,笔者对Tapestry的感情不言而喻啊。不过在亲眼见证Tapestry的变迁过程中笔者不得不佩服Tapestry作者霍华德的思想和意识。貌似霍华德总会让人们感到惊喜。当然在其将Servlet发挥到了极致的情况下也有很多T粉丝呼吁老霍应该去领导Servlet。对于web框架百花齐放的今天,Tapestry带给笔者的组件思想仍然是目前让笔者最心仪的方法。虽然其学习曲线相对较高,但高效的开发方法,超高的组件复用率都让笔者受益匪浅。
Tapestry 5.2.4是在众多Tapestry社区用户的推荐下成为Tapestry 5.2正式版的。因为在过去的将近一个的时间内,Tapestry 5.2.4目前只发现了一个bug,可见其稳定性是很不错的。说到这里,笔者是简单说下Tapestry 4.x到Tapestry 5.2的巨大变革。首先要说的是Tapestry 4与Tapestry 5几乎不是同一个东西了,似乎霍华德根本就没考虑让其向下兼容的问题,不过这样带来的好处就是Tapestry 5几乎是完全重新设计的,应用的更好更先进的思想和设计理念。
Tapestry 4.0过度到Tapestry 4.1的过程中,Jesse Kuhnert为Tapestry 4.0与著名RIA框架dojo进行了无缝的整合,因此Tapestry 4.1几乎可以说是Tapestry 4.0的Ajax升级版本(当然不仅仅是简单的整合,而是将dojo与系统内部深度的融合,让使用Tapestry的时候可以随时随地方便的使用各种dojo的优秀特性),因此Jesse Kuhnert也成为了Tapestry 4.1的领导者,这里还有个插曲就是Tapestry 4使用的是ognl作为对象赋值的工具,而这个过程中ognl的作者已经宣布不再继续维护ognl。这可让Tapestry的发展受到了很大的阻力,怎么办?此时Jesse Kuhnert再次发挥了其强大的力量,摇身一变直接成为了ognl的team leader(老外真是够猛啊,尤其是Jesse Kuhnert….,不过这位大哥也让笔者的领导折磨的够呛,双方mail list好一阵子,Jesse Kuhnert大哥对我们项目中用到的一个树组件十分头疼.)。最终在Jesse Kuhnert的带领下当Tapestry 4.1.6的时候(大概是这个版本)由于改进的ognl导致了Tapestry的性能提升了6倍之多。至此Tapestry 4.1.6一直稳定到现在,其功能已经十分优秀貌似霍华德就是因为觉得Tapestry 4系列已经足够的好,因此Tapestry 5的构思已经在其脑中浮现了。(这里笔者要提到一个笔者参与开发的开源框架,基于Tapestry 4.1.6的,叫做corner framework)
Tapestry 5的雏形是在Tapestry 4.1开发的同时进行的。而Tapestry 5相对于Tapestry 4最大的变化就是设计思路的变化。Tapestry 4中,所有的页面类 page class,都是抽象类,而霍华德在设计的时候大量使用了javassist,因为页面类都是抽象类,因此在应用运行的时候都是通过javassist生成的字节码增强类。而且针对页面类老霍还设计了一个page pool用来提高性能。此优势也是Tapestry 4相对于webwork2的Action最大的优势之一。相对于Tapestry 4在Tapestry 5中抽象类已经不见了,所有的页面类都变成了POJO,因为不需要字节码增强,因此Tapestry 5的页面池中存储的就是纯粹的POJP对象,免去了字节码增强的性能开销,性能会变得更好。同时Tapestry 5去掉了Tapestry 4中的.page文件,几乎所有的配置都是用了Java Annotation。这也让Tapestry 5的配置变得前所未有的精简。虽然Tapestry 5有上述大量的优势,但是对于Tapestry 4还是有一个让笔者感觉不太舒服的地方,那就是在Tapestry 5中,霍华德引入了tml的概念,这是一种将渲染模版是用xml schema编写的语法。在tml里,可以使用Tapestry 5的全部标签,但在dreamweaver等可视化页面开发工具中,这种tml就变成了美工无法观看的页面,而在Tapestry 4中,渲染模版是纯粹的html,这种页面时美工可以直接参与编辑的。当然对于有一定编程能力的美工来说,tml是个更好的选择,因为大量的样式都直接通过css来实现,这样页面不但变得更加精简,而且页面也更加规范。这样虽搜索引擎的抓取也是更有效的。不过这种美工在笔者身边还是比较难寻的。
Tapestry 5到Tapestry 5.1的过度笔者并没有太多的关注,因此笔者接触Tapestry 5的时候已经发布Tapestry 5.1了,总体感觉Tapestry 5.1应该算是Tapestry 5系列比较完善的一个版本吧。几乎Tapestry 4中绝大部分的特性都已经拥有了,同时也是组件,功能相对比较完善的一个版本。而从Tapestry 5.1过度到Tapestry 5.2的过程中笔者发现最大的变化仍然是老霍思维的转变。在Tapestry 4,Tapestry 5.0,Tapestry 5.1中page类始终为了提高性能而使用了page pool。对于需要大量实例的应用中pool是个很常见的提高性能的做法。最简单的就是connection pool,thread pool等。没错看起来pool有很多好处,而笔者也一直以为这是page类的最佳解决方案。不过事实证明,老霍再次将笔者雷的外焦里嫩了。。。在Tapestry 5.2中霍华德居然放弃了page pool,那么是什么力量让老霍放弃了page pool呢?答案就是老霍直接把page制作成了类似singleton模式(针对每个支持的语言环境一个实例)。好了,如果只支持一种语言,那么每个页面只有一个实例了。那么接下来问题就是并发过程中的各种状态问题了,老霍直接将页面中通过将页面类中的组件进行动态改变然后通过线程级别的HashMap(也有可能是ThreadLocal)来保存这些状态。该问题大幅度解决了访问量巨大的站点消耗在page pool上的内存问题。
说到这里,Tapestry 5.2.4的升级是十分简单的,按照老霍的说法,只需要更改下maven的配置即可,当然如果遇到什么问题,还是mail list吧。笔者貌似有一个月左右没有看Tapestry官方站点了,结果去了之后发现整个站点都改版了,说实话还真是够漂亮的说,有兴趣的朋友可以去看看。
Tapestry 5.2.4下载地址:
org.apache.tapestry tapestry-core 5.2.4
在文章开始部分,笔者提到了corner framework,有兴趣的朋友可以去google code看看,其中corner 2.5系列是基于Tapestry 4.1.6开发的,而corner 3.x是基于Tapestry 5.1系列的,当然在不久就会升级到Tapestry 5.2.4了。
corner framework地址:
corner framework下载