JSF与Struts2的瑜亮之争

刘岩

Email:[email protected]

1.        关于选择

现在的 Web MVC 框架太多了,研发、设计人员的选择也太多了。 Struts 、基于 JSF 规范的实现、 WebWork Tapestry Spring MVC Tiles …………其中还是以 Struts2 JSF 标准的实现框架最为流行,于是就有了在 Web 层的选择烦恼,选择了一个就意味着放弃了另一个。就像当年刚刚学习编程的同学们,到底是选择 Java 、还是选择 C# 、还是 PHP ,让人难以选择,网上各个阵营的口水战也从来不停止,你指责我、我也不放过你。其实我们回过头来理智的想一下,我们选择哪一个还是要具体问题具体分析。每项技术都有其适用的场景。唉 ~~ 与人家口水仗的时间,不如研究一下内核、优化内核、让你信仰的技术、语言因你的存在更进一步。

2.        相似的地方

咱们就 JSF Struts2 来看相似的地方。不同的地方就不说了,因为 JSF 仅仅是 sun 的一套接口规范,笔者是用 sun 自己的 RI 作为实际实现的包。

1 :标签组件化

JSF Struts2 都有很多标签,可以表示 HTML 组件、可以表示逻辑、都可以使用标准的 JSTL 标签、 EL 表达式,当然两者都可以使用自定义的扩展标签完成比较复杂的组件控件。

2 web 访问流程化

两者都是基于 Request-Response Http 原理, Web 流程化了:请求入口 - 》逻辑控制层 - 》响应视图。配合一个比较好的 IDE 的话,还可以将你的 web flow 以流程图的方式呈现。

JSF 如下:
JSF与Struts2的瑜亮之争_第1张图片
 

Struts2 如下:
JSF与Struts2的瑜亮之争_第2张图片
 3 :请求值注入

两个框架都实现了将表单、请求 URL 参数、 AJAX 请求参数通过各自的机制注入到了自己的控制层( Struts2 Action JSF 是托管 Bean )。这样省去了很多从内置 request 对象传递过来、转换的中间过程。很多人用了 Struts2 就不愿意用 Struts1 ,很大程度上也是冲这个原因!

4 :可以和其他框架进行集成

无论是 JSF 还是 Struts2 都可以和 Spring 进行了集成,在配置文件上也不是很复杂。就可以用 Spring 注入的各种 Bean ,为 Web 控制层服务。

5 :由一个类充当 MVC C

2 个框架都是用一个小小的类当做 web 流程控制器。一般是接收视图层的参数后调用业务层的服务,根据业务层的服务结果返回不同的视图。 Struts2 的类只需要继承一个特殊的类 ActionSupport ,而 JSF 的控制器就是一个任意 POJO 的类( JSF 叫做托管 Bean )。

6 :在 web 控制器层执行的方法

两个框架都是这样的形式

Java代码  收藏代码
  1. public  String 方法名(){  
  2. return   “结果视图名”;  
  3. }  

 7: 动态调用控制器的方法

在视图层, 2 个框架都可以动态的调用控制器层的不同方法,这个有点像 Struts1 的分发 Action 的概念。

Struts2 是如下形式

Java代码  收藏代码
  1. <form name= "adminLoginForm"  action= "userAction!login.action"  method= "post" >  

 JSF 如下

Java代码  收藏代码
  1. <h:commandLink action= "#{adminAction.deapplyDispelUser}"  value= "【不注销】" >  

 

8:2 个框架的组件都有生命周期这个概念

JSF 的组件有生命周期的概念,同样 Struts2 的对像也是有生命周期这个概念的。就因为 JSF 组件的概念使得 JSF 生命周期比 Struts2 的生命周期更重视。

9 :控制层非单例

一般情况下, JSF 的托管 Bean Struts2 Action 都是非单例的,所以可以放心大胆地去用它的局部变量。当然了如果你非要节省资源,在保证局部变量线程安全的情况下,也是可以使用单例的控制器的。

10 :都有页面模板框架

这两个框架都有相应的页面模板框架,来统一页面的风格、布局。 Struts2 FreeMaker 等等、 JSF facelets

3.        各自的优势

Struts2 的优势:虽非 Sun 承认的标准,但是在 web 层几乎占据了国内的大部分市场份额。学习的人多,所以在某些程度上推动了 Struts2 的发展。 Struts2 倡导简单、方便、易用。因此绝大多数的轻量级应用在 Web 层都是使用 Struts2 。再加上 Apache 组织对此开源项目的支持, Struts2 已经成为了真正的“非贵族们的”、“草根们”的宝贝!结合其他 JS 框架可以开发出灵活、富有生动的 web 应用。

JSF 的优势:是 Sun JavaEE 标准,底层实现有 Sun 自己的 RI Apache 组织的 MyFaces 。其他的 JSF 实现框架可能暂时还没有流行起来。 JSF 的组件话思想和面对事件监听机制的响应是让做 C/S 的人快速转移到 B/S 开发,组件。这点笔者可以说,是偷自 ASP.NET 的。而他最大的优势就是可以在托管 Bean 中可以为其注入 EJB 组件。

4.        各自的使用场景

如果是开发分布式应用,而又不得不使用 Sun EJB Web Service 等等 EE 规范技术的话,笔者个人认为在 Web 端使用 JSF 还是首选。因为一般在这种需求上,稳定的系统、数据库事务的严谨性、各个子模块的互相调用的事务性都是首要的!而在于前端的用户体验上不是说不重视,而在整个系统中并不是最重要的。利用 JSF 的优势是比较适合的。

如果开发的也是分布式应用,而可以不按照 Sun 的规范自己用其他技术实现分布式应用,那么前端还是建议采用 Struts2 比较好。配置灵活、配合各种 JS 框架可以开出用户体验非常良好的前端界面。尤其是做非复杂业务的敏捷 Web 框架, Struts2 REST 模式还真的挺适合的。做个网站,那快得叫一个爽啊 ~

当然,最后还是由您自己来选择 Web 层框架。

5.        最后谁是孔明?谁是周瑜?

《三国演义》,这个是个伪命题。诸葛亮难道就比周瑜高明?最后还不是无奈得被司马懿耗死了。我们清楚赤壁之战是大家的功劳,孔明年轻时那确实勾心斗角谁也不如他 ~ 等到了北伐的时候就感觉孔明那么无奈啊 ~~ 上方谷明明能烧死司马懿,那个时候能够明细天气情况的孔明怎么没了?突然下了场大雨救了司马懿。周瑜遇到孔明后着实郁闷很久,既生瑜何生亮 ~ 世间就是这么无奈 ~~~ 到最后各位读者可以发现,其实你的人生处处充满了双雄模式 ~~ 呵呵,最后一句话就是,管谁是孔明,谁是周瑜呢!只要能够被我们所用就行了。

你可能感兴趣的:(struts2)