一.拦截机制不同
struts2时类级别的拦截,每次请求回创建一个Action,和spring整合时Struts2的ActionBean注入的作用域是原型模式的Prototype,然后通过Set,Get将request数据注入到属性中。struts2中,一个Action对应一个request(请求),response(响应),属性参数是多方法共享的,所以可以通过属性接收参数。struts2 中的Action一个方法对应一个url(连接),而其类属性被所有方法共享,所以无法使用注解活其他方式标识其所属方法,止咳以设计为多例。
springMVC是方法级别的拦截,一个方法对应request(请求),因此方法基本独立 独有request(请求)和response(响应)的数据,不同的方法对应不同的url,参数的传递是直接注入到方法中,是方法独享的。处理结果通过modemap(模式映射)返还给框架。在和spring整合时,springMVC中的controller Bean默认是单例模式(singleton),所以默认对所有请求只会创建一个Controller,没有共享属性线程安全,如果想改变作用域需使用@scope注解。
struts2有自己的拦截机制(Interceptor),springMVC用的是独立的面向切面(AOP),因此struts2的配置文件比springMVC的大。
二。底层架构不同
struts2使用filter(过滤器)StrutsPrepareAndExecuteFilter实现,springMVC(DispatcherServlet)则使用Servlet(监听器)实现。filter在服务启动时初始化,服务停止时销毁(比servlet销毁晚)。servlet在调用时初始化(比filter创建早)服务停止销毁。
三。性能
struts2是类级别的,每次都要对应一个行动Action,需要加载所有的属性进行注入,SpringMVC实现了0配置,是基于方法的拦截,有加载一次单例模式的bean注入。所以效率比struts高。
四.配置
springMVC与spring无缝配置 所以对项目的管理和安全上比struts更高
拦截器与过滤器的区别:
拦截器是基于java的反射机制的,而过滤器是基于函数回调。
拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次