本文是在Tapestry官方文档的基础上翻译整理过来的,有时间再翻译其他主要章节,希望有兴趣的可以多多交流!水平有限,还望高手多多指正!
概要
Tapestry是一个开源的框架,用以创建动态的、健壮的、高可扩展性的Java web应用,它是在Java Servlet API基础上的扩展,因此它可以工作在任何一个Servlet容器和应用服务器中。Tapestry将web应用划分成一组页面的集合,每个页面都构建在 组件上。Tapestry框架主要负责:URL构建与转发,客户端与服务端状态的持久化,用户输入校验,国际化和异常报告。开发Tapestry应用包括 用普通HTML创建的HTML模板和绑定在模板上的少量Java代码。在Tapestry中,我们用对象及对象的方法和属性而并非是针对URL和查询参数 (query parameters)创建应用程序,从而为Java web应用带来了一个真正的面向对象的开发。Tapestry可适用于开发小型应用,也可以大到大型的多个团队开发的由数百页面组成的大型应用。 Tapestry可以轻易地集成各种后台,包括J2EE、HiveMind和Spring。
Tapestry的优点主要体现在:对于开发者,代码改变后不需要重新部署或重启便可立刻看到效果以及快速启动;对于设计 者,Tapestry模板非常接近于普通的HTML,不像JSP那样看着让人难懂。对于管理者,可以轻易的让团队工作在一起,另外还包括它的国际化的重要 特性。
Tapestry以Apache Software Licence 2.0证书发布。
Tapestry被分成了以下几个模块:
tapestry-core
|
框架的核心,包括所有基本的内置组件。
|
tapestry-ioc
|
Tapestry IOC 容器。
|
tapestry-spring-integration
|
与Spring集成。
|
tapestry-test
|
Tapestry测试工具集。
|
Tapestry-hibernate
|
与hibernate集成。
|
Tapestry框架的开发由一些无偿的自愿者组成。粗略的时间安排是:
2007年春季早期——前基本组件与特性。这包括所有的form组件,加上BeanEditForm和Grid,还有客户端持久化与其他重要特性。
2007年夏季前——Ajax特性的加入。我们正在寻求与apestry 4.1可比的更易使用的特性。
Hibernate 和 Spring的集成。(由于许可证书的原因可能从Apache中分离出来)
2007年秋季——最终版。
新特性
Tapestry 5是基于全新的代码,开发小组决定把Java Web组件开发提高到一个新的效率上。新版本删掉了Tapestry 4的许多限制。
组件不用再继承基类。
组件类不再是抽象类。组件都是纯粹的简单的POJOs (plain old Java objects)。
Tapestry不再使用XML页面以及组件配置文件。所有配置文件的信息现在都直接用Java annotations写在Java类里。
所有对Tapestry组件模板和类的修改现在都可以立刻反应出来, 不需要任何重启。这将不仅反映在开发中,同样反映在产品中。
快速(Blazing Speed)。 新代码的基本操作要比Tapestry 4快很多。关键代码路径得到简化,反射的使用已经消除。Tapestry 4速度同比于Servlet/JSP应用,Tapestry 5 要更快一些。
目前状况
先前发布的Tapestry 5.0.1,可以通过Maven或download 得到。这一版本功能有限且不稳定,用以收集用户反馈。请发送你的见解到Tapestry邮件列表…所有的都会经常发生改变(因此,我们现在已经着手收拾我们的烂摊子,修改我们要修改的东西)。
原则一 —— 静态结构,动态行为
Tapestry
从以下几个维度来设计高可伸缩性:
Tapestry
应用可以包含多个页面和许多自定义组件。
Tapestry
应用可以包含非常复杂的功能。
可备大型的多个的团队开发Tapestry应用。
Tapestry
应用可以响应大量的并发用户。
Tapestry
存在一个核心的构建策略(静态结构,动态行为)就是服务于以上目标的。
Tapestry
并不需要将页面实例存储在HttpSession中。大部分的情况下,它仅仅存储一些少量的页面的持久化字段值,并非整个页面实例。依赖于这种对HttpSession的使用是Tapestry特别在集群配置下具有高可扩展性的关键。
在一些类似于Tapestry的框架,比如Faces 和 Wicket,页面结构动态性更高,体现在更多的存储代价上(HttpSession中存有更多的数据)。
公用的对内部的
有一个问题一直苦脑着Tapestry 4先前的版本,就是在私有(private)、内部的(internal)APIs和公用的(public)、扩展的(external)APIs上缺乏 清晰的界线(deliniator?)。事实上你的代码得继承自基类对象,但是许多基类对象方法的不可访问性让此问题更是困惑。这也是“Tapestry 陡峭学习曲线”的关键因素。
由于Tapestry 5基于全新的代码,我们可以更好的区分内部的(internal)与扩展的(external)。首先,任何 org.apache.tapestry.internal包下的都是内部的(internal),它是Tapestry的部分实现,就像一个在窗帘后的 人。你不必直接引用这此代码,直接的引用将会给版本升级带来问题,因为内部的(internal)代码不会在版本升级中考虑其向后兼容性。
向后兼容性
Tapestry一直苦于各主要版本的向后兼容性。 Tapestry 5未曾考虑向后兼容Tapestry 4。但是它为向后兼容铺下了基础。Tapestry 5的 API几乎都是基于annotations,你得在类上声明以表示它们是组件,在字段上声明以提供Tapestry来维护它们的状态以及注入资源 (resources)。在方法上声明告诉Tapestry这个方法什么时候以及是否被调用。
Tapestry将会适配你的类,它将通过方法的参数传入值来调用你的方法。不再是生硬的实现已有的接口,Tapestry用annotations所提供的线索及简单的命名约定来适配你的类。
正因为如此,Tapestry将有能力深入改变自己内部代码而不影响你写的应用程序代码。这最终会打破向后兼容的坚壳,给予了一个大的保证,那就是不改变已有应用代码情况下实现版本的升级。