板桥里h http://www.jdon.com 2005/09/12
Struts/Tapestry/JSF是目前J2EE表现层新老组合的框架技术。从诞生旉上看QStruts应该比较早,使用得非常广泛,Tapestry 3.0逐渐引vq泛的重视,正当Tapestry卛_大显w手时期QSUN推出JSF标准技术,虽然JSF一开始推出尚不成熟,留出了一D늩白期Q但是随着JSF1.1标准推出QJSF开始正面出击,_面隆重d了?/p>
其实QJSF和Tapestry也ƈ不是那种头碰头的相同竞争性技术,两者还是各有侧重点的,不过比较l微Q但是这U细微点在实C个大工程时可能带来不同的感受和变化?/p>
首先Q我们从一个高度来抽象一下表现层框架应有的技术架构,下图可以说所有表现层框架技术都必须实现的功能架构图Q?/p>
当然Q我们不必废话罗嗦MVC模式QMVC模式是基准模式,现在框架技术已l不必再拼是否是MVC模式了?在上图MVC模式基础上,一个表现层框架无外乎要实现图中的三个功能:
1.在当前页面能够显CZ个组件对象的内容Q而不是象UJSP那样Q需要在Jsp面写入“调用对象方法”的Java代码?/p>
2.当用h下页面的提交按扭或链接后Q事件发生,q时应该触发服务器端q将当前面的参数提交给服务器。这U机制表现在Form表单提交和有参数的链?lt;a href=""></a>
3.从一个页面视囄接蟩转到另外一个页面视图,单纯的导航作用?/p>
我们通过下表来比较这 三种框架在实C囑个功能时技术细节,从而得Z们的异同点和偏重炏V?/p>
|
Strutslg~程模型
Struts实现lg~程时有一些复杂:l常Z个页面中需要引入多个组件而头|因ؓStruts中无法直接引入多个组Ӟ必须l一些圈?
一般分两种情况Q如果同一个Action可以对付这些组Ӟ那么在这U情况下有两个办法:
1.这多个lg装入一个ActionForm中,如?span class="unnamed3">MapForm{机Ӟ
2.手工多个组件装入request/session{scope中,然后Ҏ其名U在jsp中获得?/p>
q两个方法都有缺点: W一U办法经怸个ActionForm弄得面目全非Q变成一个大杂烩Q违反了OO分派装的原则;W?U办法其实又回到jsp~程Q?/p>
W二U情况,如果q些lg必须有预先由不同的Action来处理,每个lg必须l过Action -->ActionForm程Q在q种情况下有两种办法Q?/p>
1.使用Tiles, 不同程输出到同一个页面的不同区域。是一Uƈ行处理方式?/p>
2. 对多个流E首q,W一Action forwardl果是第二个ActionQ最后输Z个JspQ在q个jsp中就可以使用前面多个程的多个ActionForm了,q属于串行方式?/p>
Strutslg模型~点
Strutslg~程必须限定在Action/ActionForm/JSPq三个框框中做文章,隑ֺ相对比较大,而Tapestry/JSF则没有太多这些技术框框限Ӟ两者在lg~程斚w更让~程者自׃些,方便一些,q也是组件型框架的优势吧?/p>
Struts标签?/strong>
在Struts中,l常需要用标{ֺ来显C组件ActionForm中内容,q就涉及C个结合的问题Q标{ֺ是别人写的,参考Struts的标{ֺ用法Q而组件是自己的,隑ֺ和麻烦就体现在这个结合点上?/p>
JSF基本思\和Struts差不多,只不q换了不同标{ֺQ也需要标{ֺ+lg的结合思考,不过因ؓlgq里是通用lgQ没有什么限Ӟ所以这hStruts要轻松一些?/p>
Tapestry使用了组件库概念替代了标{ֺQ没有标{ֺ概念Q这样就没有标签库和自己的组仉要结合的问题Q都是组件的使用Q组件中分Tapestry标准lg和自己定义的lgQ这也是接触了Jsp体系的h学习Tapestry面的一个思\转换?/p>
具体以页面蟩转ؓ例子Q页面蟩转是靠链?lt;a href="目标"></a> 实现Q链接是面l常使用的元素?/p>
Struts提供的html:link在频J用就特别不方便,其在传递多个参数时Q其中html:link的page|是蟩转对斚w面或Action的pathQ这个path一般需要到struts-config.xml查找Action的相应path,一旦配|文件pathg改,涉及到这个所有相关页面都要修攏V?/p>
JSF链接概念划分两个方面:D性质和事件激z,在导航方面还是需要到配置faces-config查询Navigation的from-outcome的倹{?/p>
׃Tapestry没有标签库概念,只有lg或页面两个概念,因此Q链接蟩转目标要么是lgQ要么是面Q简z简单,它没有多余的path概念Q就是组件名Q也是对象名称Q组件名U和path名称合二Z?/p>
ȝ
JSF在很大程度上cMStrutsQ而不是类似TapestryQ可以说是一UStruts 2.0Q都是采取标{ֺ+lg的Ş式,只是JSF的组件概忉|有象Struts那样必须l承ActionForm的限ӞJSF在事件粒度上要细腻,不象Struts那样Q一个表单一个事ӞJSF可以l化到表单中的每个字D上?/p>
JSF只有在组件和事g机制q个概念上类似TapestryQ但是不似Tapestry那样是一个完全组件的框架Q所以,如果你做一个对面要求灉|度相当高的系l,选用Tapestry是第一考虑?/p>
Struts/JSF则适合在一般的数据面录入的系l中Q对于Struts和JSF的选用Q我目前个h观点是:如果你是一个新的系l,可以直接从JSF开始;如果你已l用StrutsQ不必{换,如果需要切换,可以JSF和Tapestry一赯虑?/p>
另外QJSF/Tapestry不只是支持HtmlQ也支持多种客户端语a如WML或XUI{?/p>
q三者之间关p:如果说Struts是左z;那Tapestry则是xQ而JSF则是中间z,中庸M是SUN联盟的一贯策略?/p>
当然Q你也可以发表你在实践中q三者Q何一个的使用感受Q以使得后来者有一个比较?/p>
相关Q?/p>