Web框架是人们在使用某种语言编写Web应用服务端时关于架构的最佳实践。
有些Web框架是从实际的Web项目抽取出来的,也就是说,做一个具体的应用项目时,采取的架构比较理想,就把这部分和领域无关,而仅和Web的请求和响应处理有关的设计拿出来,形成一个基础,在开发别的应用项目的时候则可以从这基础做起,让开发者更关注领域问题,而不是Web的请求和响应的控制。
也有些Web框架是直接设计出来的,很多Web框架在设计的时候也都借鉴了别的框架,吸取优点,修改不足,并根据自己的框架的定位,在特定方面有自己的发挥,形成了自己的特点,比如有的web框架追求的是松耦合性,层次,结构之间都不密切绑定,有的Web框架则追求敏捷性,强调约定而不是配置。
Java 的 Web框架虽然各不相同,但基本也都是遵循特定的路数的:使用Servlet或者Filter拦截请求,使用MVC的思想设计架构,使用约定,XML或 Annotation实现配置,运用Java面向对象的特点,面向抽象实现请求和响应的流程,支持Jsp,Freemarker,Velocity等视图。
JSF
优点:
Java EE标准,这意味着有很大的市场需求和更多的工作机会
上手快速并且相对容易
有大量可用的组件库
缺点:
大量的JSP标签
对REST和安全支持不好
没有一个统一的实现。既有SUN的实现,又有Apache的实现——MyFaces。
国内的OperaMasks还支持AJAX,以及有开发工具 支持
Spring MVC
优点:
对覆盖绑定(overriding binding)、验证(validation)等提供生命周期管理
与许多表示层技术/框架无缝集成:JSP/JSTL、Tiles、Velocity、FreeMarker、Excel、XSL、PDF 等
便于测试——归功于IoC
缺点:
大量的XML配置文件
太过灵活——没有公共的父控制器
没有内置的Ajax支持
Stripes
优点:
不需要书写XML配置文件
良好的学习文档
社区成员很热心
缺点:
社区比较小
不如其他的项目活跃
ActionBean里面的URL是硬编码的
Struts 2
优点:
架构简单——易于扩展
标记库很容易利用FreeMarker或者Velocity来定制
基于控制器或者基于页面的导航
缺点:
文档组织得很差
对新特征过分关注
通过Google搜索到的大多是Struts 1.x的文档
Tapestry
优点:
一旦学会它,将极大地提高生产率
HTML模板——对页面设计师非常有利
每出一个新版本,都会有大量的创新
缺点:
文档过于概念性,不够实用
学习曲线陡峭
发行周期长——每年都有较大的升级
Wicket
优点:
对Java开发者有利(不是Web开发者)
页面和显示绑定紧密
社区活跃——有来自创建者的支持
缺点:
HTML模板和Java代码紧挨着
需要对OO有较好的理解
Wicket逻辑——什么都用Java搞定
在Java的Web框架中,我使用过Struts1,Struts2,试用过Stripes,Wicket,了解过JSF,SpringMVC。以我使用的经验,我觉得看一个Java Web框架应看看下面几个方面:
1.设计理念
一个框架设计出来应该有一个基本的思路,它为什么要要被设计出来?有的框架的目标 就是提高效率,有的框架的目标的给用户充分的选择,有的框架的目标是充分了解实际需求,给用户一个尽量合理的默认选择,有的框架是要给使用者开发桌面程序的感觉。应该说,一个好的框架应该是实现了预期目标,体现出了自己的设计理念的。
2.设计的合理性
设计的合理性表现在框架在一些关键问题上的处理,比如灵活性和敏捷性之间的权衡,硬编码和文本配置之间的权衡。灵活性指的是可以适应用户多样的需求,很特殊的要求也能得到支持,有的框架的实现基于太多的约定,使得用户只能遵循。而敏捷性指的是用户在解决绝大多数常规问题的时候,能尽量少做工作,提高效率。框架设计者只能在这两者见达到一个平衡点,权衡的怎么样,就很见水平了。硬编码和文本配置之间的权衡也很有意思,文本配置的意义在于Java是一个编译语言,强调代码的封闭,讲究扩展而不是修改,这种情况下文本配置信息可以很方便的在不修改程序的情况下改变程序行为,但是随着一些灵活的脚本语言实现的 Web框架的出现,人们发现在这样的框架中,脚本语言即做程序编码语言,也做配置语言,还做视图上的标记语言,这使我们对Java实现的框架有了一番新的审视,既然配置文件并没有消除对程序的修改,为什么不能在应编码上下下功夫呢?
3.设计的平衡性
设计的平衡性指的是,框架在设计流程中各阶段,各层次的实现方式时,所达到的上述权衡(灵活性和敏捷性之间的权衡等)应该是具有一致的水平。一个在控制上过分灵活,而视图上具有非常大限制的框架是不能算做一个好的框架的。
4.框架真的解放了开发者吗
框架的目的是让开发者把更多的精力放在领域问题,而非Web的请求和响应的处理问题上。而事实上框架都做到这一点了吗?不可否认,框架的使用提高代码的可维护性,但是框架在解放开发者这点上就未必了,有时还给开发者带来了额外的负担。事实上,直接使用Servlet,只要维持好代码风格,一样可以很有效率,当然,直接使用Servlet的灵活性就不用说了。
在我接触的Web框架中,我最推崇的是Struts2,设计优雅,偏重灵活,也基本不造成额外的负担,当然这些评价是和我参与的项目的规模有关的,其他规模的项目Struts2就未必合适了。我希望Struts2能在下面几个方面有些改善:
1.在提供文本配置方式的基础上给一个约定配置的方式,让开发者在大多数情况下可以不配置。
2.配置也支持硬编码,因为有时候维护可修改的硬编码是很有效率的。
3.在拦截请求上,能借鉴下ROR,Django的思路,适应新的Url的需求,考虑大家对“?”后添加属性的回避,支持带占位符的Url。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gohands/archive/2009/08/31/4503123.aspx