一、性能:
看了几篇关于三者的性能比较的文章:(这些文章和测试我并没有做过实验,仅用于参考)
结论如下:
注:测试都没有数据库,也没有复杂业务,action和jsp中内容很简单,目的就是测试MVC部分的性能。
1.纯JSP的性能应该最高,这不难理解,JSP被编译成Servlet后,没有任何多余的功能,收到请求后直接处理。(这也验证一句经典的话:越原始效率就越高。)
2.struts1的性能是仅次于纯JSP的,由于struts1采用单例Action模式,且本身的封装相比struts2应该说简单很多,虽然开发效率不如struts2,但已经过多年的实践考验,性能稳定高效。
3.相比来说struts2的性能就比较差了,这不难理解,struts2之所以开发方便,是由于采用值栈、OGNL表达式、易做图等技术对请求参数的映射和返回结果进行了处理,另外还采用大量的标签库等,这些都无疑增加了处理的时间。因此降低了效率。在我们实际的项目中,我测试本地工程访问每秒处理请求数只能达到35左右,应该说还有不少可优化的空间。
4.很多人认为struts2性能差是因为它的多例Action模式导致的,但我们采用spring管理struts2的Action,并设置按单例方式生成Action实例后,发现其性能有所提高,但并不是很明显。由此可见,多例Action模式并不是struts2性能瓶颈所在。另外,我们在struts2中采用JSP方式访问,发现其性能依旧和没有采用任何MVC框架的纯JSP之间存在好几倍的差距,这又从另一个侧面证实了我们刚才得出结论,struts2性能的瓶颈不在于它的多例Action模式。
struts2框架性能很好, 但struts2的标签性能太差了。 要避免使用 struts2标签。
Struts2 由于采用了 值栈、OGNL表达式、struts2标签库等,会导致性能下降,很严重的下降。如果避免或减少使用这些,性能还是很好的。
Struts2的 多层易做图、 多实例action性能都很好,并不是 导致性能问题的原因。
5.SpringMVC3的性能略逊于struts1,但基本是同级别的,这让人眼前一亮,springMVC有着不比struts2差的开发效率和解耦度,但性能却是struts2的好几倍,这让我们灰常振奋,SpringMVC无疑又是项目开发的一个好的选择。唯一的问题就是,目前国内使用面还不太多,各方面的参考资料相对较少,上手的话可能要稍微难点。
我的结论:使用这三个框架并不会带来数量级的性能影响,但可以提高开发效率。
二、架构
虽然三者都是基于MVC思想的架构框架,但是springMVC是REST架构思想的实现。
struts1和springMVC的入口都是servlet,而struts2的入口是filter。
三、springMVC与struts2比较:
1、spring mvc是基于方法的设计,而sturts是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。spring3 mvc是方法级别的拦截,拦截到方法后根据参数上的注解把request数据注入进去,在spring3 mvc中,一个方法对应一个request上下文。而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入,struts2实际上是通过setter getter方法与request打交道的,struts2中,一个Action对象对应一个request上下文。
2. 参数传递struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。
3. 设计思想上,struts更加符合oop(面向对象编程)的编程思想, spring就比较谨慎,在servlet上扩展。
4. intercepter的实现机制,struts有以自己的interceptor机制,spring mvc用的是独立的AOP方式。这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承,所以我觉得论使用上来讲,spring mvc使用更加简洁,开发效率Spring MVC确实比struts2高。spring mvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应
所以说从架构本身上spring3 mvc就容易实现restful url。struts2是类级别的拦截,一个类对应一个request上下文实现restful url要费劲因为struts2 action的一个方法可以对应一个url而其类属性却被所有方法共享这也就无法用注解或其他方式标识其所属方法了。spring3 mvc的方法之间基本上独立的独享request response数据请求数据通过参数获取处理结果通过ModelMap交回给框架方法之间不共享变量而struts2搞的就比较乱虽然方法之间也是独立的但其所有Action变量是共享的这不会影响程序运行却给我们编码读程序时带来麻烦。
5. 另外spring3 mvc的验证也是一个亮点,支持JSR303处理ajax的请求更是方便,只需一个注解@ResponseBody ,然后直接返回响应文本即可。
四、三者比较
注:主要是struts1和struts2的比较,由于个人对于springMVC使用的并不多,所以对于其中的一些特性 不敢武断给出结论,因此下表中空出许多,若以后继续研究则会回来补齐,也更希望读者给予指点帮助。谢谢!
特性 Struts 1 Struts 2 springMVC
Action类 Struts 1 要求Action 类要扩展自一个抽象基类。Struts 1 的一个共有的问题是面向抽象类编程而不是面向接口编程。 Struts 2 的Action 类实现了一个Action 接口,连同其他接口一起麳实现可选择和自定义的服务。Struts 2 提供一个名叫ActionSupport 的基类麳实现一般使用的接口。虽然,Action 接口不是必须的。任何使用execute 方法的POJO 对象可以被当作Struts 2的Action 对象麳使用。 Controller,不需要继承父类或实现接口,核心控制器是servlet。
线程模型 Struts 1 Action 类是单例类,因为只有一个示例麳控制所有的请求。单例类策略造成了一定的限制幷且给开发带来了额外的烦恼。Action 资源必须是线程安全或者同步的。 Struts 2 Action 对象为每一个请求都实例化对象,所以没有线程安全的问题。(实践中,servlet 容器产生许多丢弃的对象对于每一个请求,多于一个的对象并不影响垃圾收集)
Servlet依赖 Struts 1 的Action 类依赖于servlet API 以为HttpServletRequest和HttpServletResponse 作为参数传给execute 方法当Action 被调用时。 Struts 2 的Action 不和容器有关。Servlet 上下文被表现为简单的Maps ,允许Action被独立的测试。Struts 2 的Action 可以访问最初的请求和相应,如果需要的话。然而,其他的架构元素减少或者排除直接访问HttpServletRequest 或者HttpServletResponse 的需要。
易测性 测试Struts 1 的主要障碍是execute 方法暴露了Servlet API 。第三方的扩展,Struts 测试用例,提供Struts 1 的集合对象。 Struts 2 的Action 可以通过实例化Action 麳测试,设置属性,然后调用方法。依赖注入的支持也是测试变得更简单。
接受输入 Struts 1 使用ActionForm 对象麳捕获输入。象Action 一样,所有的ActionForm 必须扩展基类。因为其他的JavaBean 不能作为ActionForm 使用,开发者经常创建多余的类麳捕获输入。DynaBeans 可以被用来作为替代ActionForm 的类麳创建。但是开发者可以重新描述已经存在的JavaBean 。 Struts 2 Action 属性作为输入属性,排除第二个输入对象的需要。输入属性可能有丰富的对象类型这些类型有他们自己的属性。Action 的属性可以通过标签库麳访问。Struts 2 也支持ActionForm 形式。丰富的对象类型,包含业务或者域对象,可以被当作输入或者输出对象麳使用。模型驱动特性简化标签对POJO 输入对象的引用。 既可以属性作为输入属性,也可以作为参数输入属性。
表达式语言 Struts 1 整和JSTL ,所以它使用JSTL 的表达式语言。表达式语言有基本的图形对象移动
补充:软件开发 , Java ,