1. 机制:spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同。
2、SpringMVC是基于方法的拦截,而Struts2是基于类的拦截。
3、spring3 mvc拦截到方法后根据参数上的注解,把request数据注入进去,一个方法对应一个request上下文。struts2每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入,一个Action对象对应一个request上下文。
4、性能上spring会稍微比struts快,spring mvc使用更加简洁,开发效率Spring MVC确实比struts2高(拦截器、restful url的实现上)
5、spring3 mvc支持JSR303,处理ajax的请求更是方便,只需一个注解@ResponseBody ,然后直接返回响应文本即可。
有状态和无状态的对象基本概念:
有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的。一般是prototype scope。
无状态对象(Stateless Bean),就是没有实例变量的对象,不能保存数据,是不变的,是线程安全的。一般是singleton scope。
对于那些会以多线程运行的单例类
局部变量不会受多线程影响,
成员变量会受到多线程影响。
例如Web应用中的Servlet,每个方法中对局部变量的操作都是在线程自己独立的内存区域内完成的,所以是线程安全的。
对于成员变量的操作,可以使用ThreadLocal来保证线程安全。
springMVC中,一般Controller、service、DAO层的scope均是singleton;
每个请求都是单独的线程,即使同时访问同一个Controller对象,因为并没有修改Controller对象,相当于针对Controller对象而言,只是读操作,没有写操作,不需要做同步处理。
Struts2中的Action因为会有User、BizEntity这样的实例对象,是有状态信息 的,在多线程环境下是不安全的,所以Struts2默认的实现是Prototype模式。在Spring中,Struts2的Action中scope 要配成prototype作用域。