最近研究了一下srtuts2.0,将一些心得准备以一个系列的方式列一下。
一、MVC思想及其优势
MVC思想将一个应用分成三个部分:Model(模型)、View(视图)、Controller(控制器)。这三个部分以最少的耦合协同工作,从而提高应用的可扩展性及可维护性。
MVC特点:1、多个视图对应一个模型。2、模型返回的数据与显示逻辑分离,模型数据可以应用任何显示技术,例如JSP,Velocity,或者生成Excel。3、应用被分成三层,降低了各层之间的耦合,提高可扩展性。4、MVC更符合软件工程思想,不同的层各司其职。
常用的MVC框架介绍:全世界第一个MVC框架是struts,2001年出现。现在比较流行的MVC框架罗列如下:
JSF:他是标准,这是他的优势。但也有一些缺点:用户较少,资源不是很丰富,和Servlet API耦合;成熟度还有待于进一步提高。
Tapestry:具有很好的分工合作。
Spring MVC框架:设计比较好,但是使用起来比较复杂,和Servlet API耦合,有人说Spring有过度设计的危险,但是我有些不理解这句话的含义。
Webwork,类似struts2,较好的设计,从ServletAPI分离。
Model1和model2:
Model1:JSP页面接受处理客户端请求,对请求处理后直接做出相应。用javabean处理业务逻辑,这个时候JSP既做控制器又做视图。
Model2:Servlet作为前端的控制器,JSP作为视图,javabean作为控制器。
二、struts2概述
Struts1的缺点:
1、 支持的表示层技术单一
Struts1只支持JSP视图技术,当然,通过某些不自然的整合可以支持velocity等技术。
2、 struts与servlet API严重耦合,难于测试
比如说:如果要对struts1的Action的execute进行测试的时候,该方法有四个参数:ActionMapping、ActionForm、HttpServletRequest和HttpServletResponse,初始化这四个参数比较困难,尤其是HttpServletRequest和HttpServletResponse两个参数,因为这两个参数通常由容器进行注入的。如果脱离web服务器,Action的测试是很困难的。
3、 struts1的侵入性太大
一个Action中包含了大量的strutsAPI,比如ActionMapping、ActionForm、ActionForwad。这种侵入式的设计最大的弱点在于:切换框架会相当困难,代码复用较低,不利于重构,对struts的依赖太严重。
Struts2则在Webwork的优良基础设计的基础上,进行了一次巨大的升级(我是这样认为的)。注意,struts2不是基于struts1,而是基于webwork的。Struts2针对struts1的不足,提出了自己的解决方案(实际上大多是webwork的解决方案)。
是使用struts2还是使用webwork?本人倾向使用struts2,原因:1、毕竟struts2是对webwork的一次升级。2、webwork已经不再升级。
Struts2的大致处理流程:
1、 浏览器发送请求,如login.action
2、 核心的控制器FilterDispatcher根据请求决定调用合适的Action。
3、 Struts2的拦截器链自动对请求应用通用功能,例如验证、填充参数、文件上传等。
4、 调用Action的execute方法,实际上是调用Action代理的方法。(基于AOP理论)
5、 将结果信息输出到视图中,视图可以是JSP,FreeMarker,Velocity甚至是JSON。
<o:p> </o:p>
比较Struts1和Struts2
<o:p> </o:p> | Struts1 | Struts2 |
侵入性方面 | 非常大 | 较小 |
线程模式方面 | Struts1 Action是单例模式并且必须是线程安全的,因为只有一个Action处理请求。 | 为每个请求创建一个实例,因此没有线程安全问题。 |
ServletAPI依赖方面 | 完全依赖ServletAPI | 完全不依赖 |
可测试方面 | 脱离容器测试很困难(一般借助插件,我没有测试过) | 可以脱离容器测试 |
封装请求参数对比 | 使用ActionForm对象,并且所有的ActionForm需要继承一个基类:ActionForm。 | 可以是Action的属性,也可以是一个纯粹的POJO。 |
表达式语言 | 可以使用EL | 整合了一个强大的表达式语言OGNL。并且使用了valueStack技术。 |
类型转换: | ActionForm通常都是String类型,Struts1使用Commons-Beanutils进行类型转换,并且不可以配置。 | Struts2使用OGNL进行类型转换,同时提供很好的扩展。 |
数据校验 | 可以重写ActionForm的validate方法或者使用框架来完成校验。 | 同样struts2同样支持重写ActionSupport的validate方法和框架,同时struts2支持ajax校验。 |
配置文件 | 配置文件比较复杂,并且项目很大的时候造成配置文件臃肿。 | 可以有多个配置文件 |