Struts 里的单例和多例

不是很了解struts 里 action为什要多例。
例如现在有100个客户端访问我的web程序(没有静态变量)
那不是每个客户端都有自己的堆栈吗,为什么单例模式下客户端之间会相会影响数据。

其实单例的Action 就可以理解成一个静态的全局变量 如果Action设置成单例 那么在Tomcat启动并且第一次访问后 这个Action会一直存在 共享ActionContext和ValueStack, 这时候如果能保证单线程访问固然是没问题的 但是在并发访问的环境中, 多个访问同时通过 一套ActionContext和ValueStack存储或请求数据 必然会发生错误, 这个跟JAVA的公用静态变量有些相似之处 在JAVA中对于避免静态变量的并发使用可以通过加锁等方法避免错误 而Struts通过多例Action 确保每次请求都拥有独立的ActionContext和ValueStack,来保证数据的正确性,每次有请求访问服务器服务器都对应的创建一个Action实例以供使用

struts2的Action是多实例,也就是每次请求产生一个Action的对象。原因是:struts2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面。如果Action是单实例的话,这些数据在多线程的环境下就会相互影响,例如造成别人填写的数据被你看到了。
而struts 1的Action是单实例的,因为它的数据保存在Form类中,多线程环境下,Action只负责处理一些逻辑,并没有数据,也就是大家把它当做一个工具使用。同样servlet也是单实例的。