JSF在很大程度上类似Struts,而不是类似Tapestry,可以说是一种Struts 2.0,都是采取标签库+组件的形式,只是JSF的组件概念没有象Struts那样必须继承ActionForm的限制;JSF在事件粒度上要细腻,不象Struts那样,一个表单一个事件,JSF可以细化到表单中的每个字段上。
JSF只有在组件和事件机制这个概念上类似Tapestry,但是不似Tapestry那样是一个完全组件的框架,所以,如果你做一个对页面要求灵活度相当高的系统,选用Tapestry是第一考虑。
Struts/JSF则适合在一般的数据页面录入的系统中,对于Struts和JSF的选用,我目前个人观点是:如果你是一个新的系统,可以直接从JSF开始;如果你已经使用Struts,不必转换,如果需要切换,可以将JSF和Tapestry一起考虑。
另外,JSF/Tapestry不只是支持Html,也支持多种客户端语言如WML或XUI等。
这三者之间关系:如果说Struts是左派;那Tapestry则是右派;而JSF则是中间派,中庸主义是SUN联盟的一贯策略。
当然,你也可以发表你在实践中这三者任何一个的使用感受,以使得后来者有一个比较。
我们通过下表来比较这 三种框架在实现上图各个功能时技术细节,从而得出他们的异同点和偏重点。
|
Struts |
Tapestry3.0 |
JSF |
在View显示的组件要求 |
组件必须继承ActionForm |
分显式调用和隐式调用 组件必须继承BaseComponent |
普通POJO 无需继承 Managed Bean |
组件在View显示粒度 |
View页面只能显示与表单对应的ActionForm,配置中Action ActionForm 页面一般只能1:1:1关系。 |
可将组件嵌入页面任何一行,对使用组件数量无限制。 |
同Tapestry |
页面分区tiles |
使用Tiles标签库实现,需要另外tiles-def.xml配置文件 |
组件有自己的视图页面,通过调用组件即直接实现多个页面组合。强大自然的页面组合是其特点。 |
通过组件+标签库实现Subview,但如需重用Layout,还要结合Tiles. |
页面跳转 |
使用标签库html:link中写明目标URL,URL名称需要对照配置文件的path命名,与组件Action耦合。 |
URL名称是目标的组件名称,不涉及URL和路径等操作,方便稳固。 |
类似Struts,也需要在配置文件中查找,与组件分离。 |
参数传递 |
使用html:link时传递参数超过一个以上处理麻烦。 |
直接调用组件,直接赋予参数,没有参数个数限制 |
参数分离传递给组件 |
事件触发 |
通过表单提交submit激活,不能细化到表单里字段。 |
能够给于表单每个字段贴一个事件,事件组件必须实现PageListener接口 |
同Tapestry,事件组件必须实习ActionListener 接口 | |