成都麦柯 技术开发二部
Tapestry开发指南
Tapestry技术论坛:http://forum.cdmcs.com/viewforum.php?f=17
我的Email:gzdlw_Adong@Hotmail.com
(技术问题请在论坛发贴)
成都麦柯系统集成有限公司 www.cdmcs.com
1
数字签名人 董黎伟
辨别名:CN = 董黎伟, C =
CN-中国, O = 成都麦柯系统
集成有限公司, OU = 技术开
发二部
原因:我是该文档的作者
位置:四川成都
日期:2005.01.26 16:41:38
+08'00'
成都麦柯 技术开发二部
1, Tapestry 所处的状况
1) 为什么需要 web 框架?
多数情况下,跨不同的应用来重用商业组件是困难的,因为由商业组件提供的功能在
其它应用里不需要:它可能是唯一针对你的应用的。然而,应用服务可以在机构跨应用重
用,跟跨机构一样好,因为它们提供的服务对不同类型的应用都有用。这些应用服务可能
包括请求路由(对一个 MVC 结构),错误处理,以通用的方式产生的客户端脚本和已准备
好的标签库。
2) Tapestry 所处的状况
以下是各种 web 框架比较: (by Matt Raible)
struts Spring MVC WebWork Tapestry JSF
优
点
广泛流行;拥有
很多信息和示
例;HTML 标
签库是一个非
常好的东西。
生命周期由重
写绑定,效验等
确定;能够无缝
隙地与各种表
现层程序结合
在一起,如
JSP,XSL 等;
IC 使得很容易
测试。
结构简单,容易
被扩展;标签库
容易被自定义,
并获得 Velocity
支持;拦截机制
成熟可靠。
一旦学会,效率
很高;HTML
模板很合适美
工;有良好的社
区支持。
J2EE 规范;能
够快速和容易
地开发;丰富的
导航框架。
缺
点
ActionForms 非
常恶心;不能够
做单元测试;大
量的邮件列表
令人无法忍受
很少被使用;需
要在 JSP 中写
入大量代码;太
灵活了,反而不
能得到通用的
控制。
其文档最近才
出现,示例很
少;客户端效验
很不成熟。
文档非常概念,
而缺少实践;学
习曲线陡峭,示
例非常少;
标签依赖
JSPs;技术不够
成熟;实现资源
不单纯。
Matt Raible 认为:
如果是快速却低技术含量的项目,他会选择 struts,因为 struts 比较成熟;
如果是高技术含量的企业级项目,他会选择 Tapestry,因为 Tapestry 可重用组件;
如果是开源项目,他会选择 WebWork,因为使用 WebWork 需要对框架有更深入的认识。
成都麦柯系统集成有限公司 www.cdmcs.com
2
成都麦柯 技术开发二部
2, Tapestry 目前在我们的项目中所处的状况:
我们的成都建信的网站部分全部是用 Tapestry 做的。在过去的两个月中,我们已经解决了
Tapestry 的大部分技术问题。
我们可以在论坛上随处可见,大部分人对 Tapestry 的学习曲线问题都有顾虑。追究其根本,
原因在于:Tapestry 的理念颠覆了传统的 web 应用层框架的理念。其实所谓传统,无非就是 struts
和 JSP,因为 struts 应用最为广泛,而 JSP 几乎算是所有 JAVA 表现层框架的本源。Tapestry 也
是源于 JSP。
我不可否认,任何 web 表现层都可以用 JSP 来实现。就如同任何 java 程序都可以使用 J2SDK
来编写。但是,需要非常关注的是,我们如果真这样做,的确对程序员来说“最简单”,但是却
牺牲了工作效率。这绝对是得不偿失的。
目前成都建信网站部分,基本上是冰箱哥哥和我搭档。我负责网站表现层,而冰箱哥哥负
责向表现层提供业务逻辑。随着网站表现层部分的不断开发,我们发现一个不可否认的事实,
随着项目功能实现越多,表现层的工作越显得轻松。因为大量重复使用的 Tapestry 组件,以及
高度复用的表现层逻辑,使得工作效率大幅度提升。就如同 Hibernate 使得我们数据库业务方面
的工作效率大幅提升一样,Tapestry 使得我们在工作上的“轻松”和“快捷”也同样不可忽视。
3, 为什么要使用 Tapestry ?
Tapestry 的灵魂就四个字:基于组件。
我们来看个示例:
这是我们现在正在使用的分页方式,
int preNo, int page, String parameter
int preNo, int page, String parameter
依赖:
p
ublic class PagingAndSorting implements Serializable
业务:
p
ublic List findAllMagDoc(int preNo, int page, String parameter) {
String hql =
" select doc from MagDocModule mdm , MagDoc doc"
+ " left join fetch doc.magDocBasic"
+ " left join fetch doc.magDoc001"
+ " left join fetch doc.magDoc002"
+ " left join fetch doc.magDocLaw"
+ " where doc.Flag = 1 and doc.Id= mdm.Doc.Id and mdm.Module.Id
= " + readProperty.getType(parameter);
PagingAndSorting pas = new PagingAndSorting("mdm.ValidFrom", preNo,
p
age);
return magDocDao.find(pas, hql);
}
页面:
getDocService().findAllMagDoc(maxResult,pageNo,column);
成都麦柯系统集成有限公司 www.cdmcs.com
3
成都麦柯 技术开发二部
表现层和业务层联系的纽带是:int preNo, int page, String parameter 这三个
参数。当实现翻页功能的时候,我们实际上是控制这三个参数实现数据库查询。表现层有非常
多的分页功能,但是在翻页的时候,因为要传递三个参数,甚至可能传递更多的参数,比如说,
在网站的法律法规中,我们不光要传法规的栏目别名,还要穿法规的范围别名。因此,实际上
表现层和业务层是一种“千丝万缕”的关系。我们无法相互独立,我们甚至不知道,在新的分
页功能要求到来时,需要传递怎样的参数。
现在我有一个假设,如果表现层,直接抛给业务层一个 PagingAndSorting 对象,我们
的整体业务层和表现层,会变成怎样的关系?
对象 PagingAndSorting
对象 PagingAndSorting
现在,我们会发现,对于表现层来说,不同的分页实际上都是控制 同一个对象
PagingAndSorting;对于业务层来说,不同的业务功能实际上也是控制同一个对象
PagingAndSorting。这是不是有一点像“搭积木”?既然我们传递的是对象,可以说“想要
啥子,就传啥子”。
这就是一个变相的“基于组件”理念的应用。是的,实际上,所谓“基于元素”和“基于
组件”,与我们常说的“面向过程”和“面向对象”是相同的思维方式,只是应用环境不同罢
了。
Tapestry 就是目前比较主流的两种“基于组件”的表现层框架之一,另外一种“基于组
件”表现层框架是 JSF,但是 JSF 还不够成熟。
现在,表现层对于我们来说,就是“搭积木”。
业务
p
ublic List findAllMagDoc()
依赖:
p
ublic class PagingAndSorting implements Serializable
页面:
getDocService().findAllMagDoc();
连接渠道
连接渠道 复用
HTML 模板 Page 规范
HTML 模板 Page 规范
Page 规范 HTML 模板
Java 文件
Java 文件
Tapestry 组件是一个“黑盒子”,用于表现 HTML 响应,以及响应 HTTP 请求。
Tapestry 组件通过其规范定义。规范是一个 XML 文档,其中定义了组件类型,参数,组件模板,
包含的组件以及被包含组件之间的联系,还有所有的 assets。
在运行的时候,规范指定并实例一个类,当页面所包含的组件被表现的时候,组件将访问
HTML 模板,找到静态的 HTML 并植入组件。
成都麦柯系统集成有限公司 www.cdmcs.com
4
成都麦柯 技术开发二部
使用 Tapestry 我们能够获得以下好处:
1) 能够保证对 HTML 最少限度的干扰,也就是说,美工和表现层程序员有了非常明确的分工。
Tapestry 对 HTML 页面的介入可以仅仅是增加一个 jwcid 属性。
2) 基于组件,使得我们的表现层变成由一个个“积木”堆积而成。 Page 规范就是这些积木之
间的纽带。而 java 文件担当了处理逻辑的角色。
3) 由于表现层逻辑全部放在了 java 文件里面,使得我们对逻辑的操作达到了“随心所欲”的
地步。
4) 随着我们项目的深入,我们积累的各种积木也就越来越多,也就说,我们的工作越来越轻
松,工作效率越来越高。
以上4个特点,都是JSP所不能够带给我们的。尤其是
工作效率的提升。当然,实际上Tapestry
所带给我们的远不至这些好处。我们都知道,作为程序员,即便我们工作如何的严谨,仍然不
能够避免BUG的问题。因为不论我们如何“仔细”,但是在编程过程中,仍然无法解决一些隐蔽
的“陷阱”,甚至有些“陷阱”直到暴露之前,我们都还没有意识到其存在。现在有了Tapestry
这层“保险”,虽然我们不可否认,由于对Tapestry的熟练程度不足,可能会给我们带来新的“陷
阱”,但是Tapestry为我们解决的“陷阱”远比带给我们的“陷阱”更多更隐蔽。
Tapestry学起来困难吗?我说不难.struts简单吗?我说不简单.平心而论,一个完全不懂JSP
的人学会struts并实用到项目中,需要多长时间?我觉得,保守估计两个月吧.如果有同仁的技术
指导,一个月差不多.现在,我们有现成的项目正在使用Tapestry开发,也不缺乏“第一个吃螃蟹”
的同仁。所以我有足够的理由认为,学以致用Tapestry,一个月足已.
在这里,我不打算讨论各种框架的优势劣态。所谓尺有所长,寸有所短。我只阐述怎样使
用Tapestry,但是在开始之前,我希望能够达成某种默契:
第一:虽然我用Tapestry实现了一些功能,但是我想,这些实现方式未必就是最佳的,所
以,如果你对我某些做得不足之处,非常欢迎您指教。☺
第二:我在论坛上见过有人提如此不智的问题:“我觉得struts的标签很好用,Tapestry和
WebWork有没有类似的东西?”如果Tapestry都和struts一样了,那么还何必存在Tapestry呢?
第三:我打算分三章来讲解Tapestry,每章的开头我都会有个小小的建议.我觉得这些建议
对Tapestry的学习是有帮助的。以便更容易的颠覆已有思维。
第四:在使用Tapestry的过程中,也许会觉得某些功能,如果使用JSP来完成会简单得多。
对此我希望能够保持一个冷静的心态。俗语又云:“打架看后半场”。
OK,让我们现在来“火拼”Tapestry吧☺
成都麦柯系统集成有限公司 www.cdmcs.com
5