一、概述
Struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的所有请求。Struts1框架有3个重要组成部分:Action、ActionForm和ActionForward对象。
ActionForm必须实现ActionForm的基类,设计上并不是真正的POJO
ActionForward就是一个逻辑视图,通过在配置文件中定义ActionFoward的映射,完成逻辑视图名和实际视图资源之间的映射
Struts2核心控制器:FilterDispatcher,它其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物。
由此可见Struts1和Struts2有着藕断丝连的关系,先从断说起,Struts2并不是Struts1的升级,它在实现原理和编程应用上与Struts1都完全不同,可以说彻底抛弃了Struts1的框架。何为连?虽然WebWork在设计上确实要比struts1先进,但由于用户习惯问题,所以很难被普及,只有挂羊头卖狗肉才会被市场逐步接受,基于这些原因,WebWork开发团队与Struts1开发团队开始合作,借struts1之名,行WebWork之实,推出了Struts2。
通过以上对二者的简单了解,主要从以下10点来说明他们之间有什么区别:
二、对比
特征 | Struts 1 | Struts 2 |
Action类 | Struts1的action需要去继承一个抽象基类。一个普遍问题就是Struts1是面向抽象类编程来代替接口编程 | Struts2的action可以实现一个Action接口,也可以同时实现一些其他的接口来添置一些附加的,常用的服务。Struts2提供一个基类ActionSupport实现了一些常用的接口。虽然Action接口不是必须的。任何附带execute方法的POJO对象都可以作为Struts2的action对象。 |
线程模型 | Struts1的action是单例的而且必须是线程安全的,因为该类会只有唯一一个引用来为action处理所有的请求。单例策略会限制Struts1的action的功能以及需要扩展的额外的功能(The singleton strategy places restrictions on what can be done with Struts 1 Actions and requires extra care to develop)。Struts1的action必须是线程安全的并且是同步的。 |
Struts2的Action对象是针对每一个请求的,所以自然也就不存在线程安全问题了。 (实践中,servlet容器给每一个请求产生许多丟弃的对象,并且不会导致性能和垃圾回收问题) |
Servlet的依赖 |
Struts1的Action依赖于Servlet API,因为当Action被调用的时候HttpServletRequest和HttpServletResponse对象是通过execute方法进行处理的。 | Struts2的Action和容器的连接并不紧密。通常servlet上下文被描绘成简单的Map映射,允许Action被单独测试。当然,如果需要的话Struts2的Action也可以通过访问初始的request和response来完成一些功能。然而,其他的一些架构元素导致降低或者删除了直接访问request和response的需求。 |
易测试性 | 测试Struts1的Action有一个大障碍就是execute方法是直接暴露于servlet API的。 | Struts2的Action可以很容易的通过设置属性调用方法来进行测试。当然依赖注入的支持也使得测试变得简单。 |
输入处理 | Struts1使用一个ActionForm对象来获取用户的输入。和action一样,所有的ActionForm都必须继承自一个基类。因为其他的javaBean不能被用作ActionForm,开发者通常要写一些多余的类来获取用户输入。DynaBean可以被用做生成ActionForm类的一个选择,但是开发者需要对现有的javaBean进行重写。 | Struts2使用Action属性作为输入属性,除掉了对于输入对象的需求。输入属性可以是一个拥有他自己的属性的对象。Action属性是通过标签和web页面交互。Struts2也支持ActionForm模型,就是POJO的Form对象和POJO的Action。多数的对象类型,包括商业逻辑对象和领域对象都可以作为输入/输入对象。模式驱动特征简化了标签和POJO输入对象的关系。 |
表达式语言 | Struts1和JSTL结合,所以他可以使用JSTL的EL。 | Struts2也支持JSTL,但是这个框架也支持更加强大的表达式语言OGNL. |
表现层和类型值的绑定 | Struts1使用标准的JSP机制将对象绑定到page context来进行访问。 | Struts2使用”ValueStack”技术,所以标签不用将视图和表现的对象结合就可以得到值.ValueStack策略允许通过一系列可能具有相同属性名字但是不同属性类型的的类型来完成视图的重用, |
类型转换 | Struts1的ActionForm通常都是String类型。Struts1通过Commons-Beanutils实现类型转换。 | Struts2使用OGNL实现类型转换,框架包含了对基础和公共类型的转换器。 |
验证 |
Struts1支持通过ActionForm中的validate方法实现手工验证。也可以通过扩展通用的验证框架进行验证。对于同一个类可以有不同的验证,但是不能关联到子对象的验证。 | Struts2也支持通过validate方法进行手工验证以及Xwork验证框架进行验证。Xwork验证框架支持将验证链接到子属性,子属性使用了为属性类型和验证上下文定义的验证。 |
Action执行的控制 | Struts1支持为每一个模块分配请求处理(生命周期),但是一个模块中的所有Action必须分享相同的生命周期。 | Struts2支持通过拦截器栈为每个Action创建不同的生命周期。通常对于不同的Action根据需要都要有对应的栈被创建和使用。 |
三、总结
通过以上对Struts1和Struts2的对比,让我们更明确了它们各自的优缺点,很显然Struts2是站在前辈的基础上设计出来,它会改善和完善Struts1中的一些缺陷,Struts1中的一些悬而未决问题在Struts2得到了解决。但是struts1是老牌框架,应用很广泛,有很好的群众基础,开发人员比较好招,项目开发的风险小,成本更低!所以两者的选用视情况而定。