Struts1线程问题
Struts1是单例模式,它继承了tomcat对servlet的实现,所以这里的action在被tomcat实例化之后也是单例了,所以,struts1就产生了多线程问题了,所有的请求共用一个实例,线程是不安全的,所有的Action请求只有
一个Action对象处理,
因此尽量不要在Action中定义实例变量(或者使用synchronized进行同步),在execute方法中使用局部变量是最简单的保证线程安全的办法
也可以使用LocalThread来定义属性
Struts2线程问题
Struts2是线程安全的,每个请求对应一个Action实例,原因是struts2获取到用户的http请求,为每个请求实例化一个Action对象,Struts2的action类只是一个普通的java class
在Struts1中没有对servlet进行任何的封装,他是直接实现的java web api里面的servlet接口,所以才会有线程安全的问题,但是Struts2底层帮我们封装了Servlet,使开发人员
不必直接接触Servlet:具体实现是:Struts2截取Servlet请求,然后给每个请求实例化一个Action对象,请求结束之后销毁Action对象,Struts2中的Action和普通的Java类没有
任何区别,也就不用像Struts1里面那样去实现一个Struts的接口,所以我们可以用Spring去管理Struts2的Action,这个时候我们要注意,因为当我们在Spring里面去定义bean的
时候,spring默认用的是单例模式,所以这个时候需要修改Spring配置文件,将scope从single修改为prototype。