应用框架:对比理解Spring MVC与Struts2区别

577 阅读4分钟

导引

在Java web编程方面,比较著名的框架模型就是MVC框架,其而web中的MVC模型实现代表,以及最初的发扬壮大者,可以说就是struts了。随着发展,后来就是就是Struts2。但是Struts有较多限制以及安全问题,Spring在提供Java EE的替代平台的同事,逐渐开始了自己的MVC解决方法,这就是Spring mvc的出现以及逐步完善,这也为Spring技术平台栈提供了进一步的全方位解决之道。

当然,由于安全的问题,Struts2目前企业级的Java Web应用需求正在渐次退去,但作为学校研究和技术提升,研究一下struts2还是很有趣的。本文主要对比了两个MVC框架机制性轮廓,以便你在实际的学习中更有针对性和选择性作出取舍。

或有不妥,欢迎补充或纠正。

一、框架机制

spring mvc 和 struts2的加载机制不同:spring mvc的入口是servlet,而struts2是filter。

1、Struts2采用Filter(
StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采用Servlet实现。其结构如下

Struts2就是一个拦截器栈,也就是一系列的拦截器。处理用户的请求,OGNL的使用,表单验证 等都是默认的拦截器在起作用。最新版的struts2各方面都有所加强,尤其插件机制的增强,支持REST, AJAX和 JSON等插件机制,有兴趣可以去了解一下。

2、Filter在容器启动之后即初始化;服务停止以后销毁,晚于Servlet。Servlet在是在调用时初始化,先于Filter调用,服务停止后销毁。

spring的拦截器,主要体现在AOP的事务管理方面,还有比如一些错误或者异常的日志的显示也是通过配置spring的log拦截器来实现的。

二、拦截机制

1、Struts2

a、Struts2框架是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype(否则会出现线程并发问题),然后通过setter,getter吧request数据注入到属性。

b、Struts2中,一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。

c、Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了

2、SpringMVC

a、SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又何一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架。

b、在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改。

三、性能方面

SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。而Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,所以,SpringMVC开发效率和性能高于Struts2。

四、拦截机制

Struts2有自己的拦截Interceptor机制,SpringMVC这是用的是独立的Aop方式,这样导致Struts2的配置文件量还是比SpringMVC大。

五、配置方面

spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。

SpringMVC可以认为已经100%零配置。

六、设计思想

Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。

七、集成方面

SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。

Spring MVC与Spring无缝集成,而Struts2则需要更多的额外处理。这个从项目的管理和安全上讲也比Struts2高( 当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。

好了,还有更多细节技术支持和实现,这里就不过多的描述了。就说这么些吧。