详解Struts中的Action 单例与多例介绍

来源:爱站网时间:2019-12-24编辑:网友分享
action是多个用户访问的请求,服务器内存中只有一个对应的操作类对象,下面由爱站技术频道小编为大家详解Struts中的Action 单例与多例介绍,希望能帮到您。

action是多个用户访问的请求,服务器内存中只有一个对应的操作类对象,下面由爱站技术频道小编为大家详解Struts中的Action 单例与多例介绍,希望能帮到您。

 Struts中的Action 单例与多例详解

struts2中action是多例的,即每次访问网络地址的时候都会产生一个action

public class pr_action {
  public pr_action(){
    System.out.println("创建action成功!!!");
  }
  public void execute(){

  }
}

运行代码可以看到,每次访问该网络地址都会在控制台输出一次!!!

如果是单例的话,若出现两个用户都修改一个对象的属性值,则会因为用户修改时间不同,两个用户访问得到的属性不一样,操作得出的结果不一样。

举个例子:有一块布长度300cm,能做一件上衣(用掉100cm)和一件裤子(用掉200cm);甲和乙同时访问得到的长度都是300cm,
甲想做上衣和裤子,他先截取100cm去做上衣,等上衣做完再去做裤子,而乙这时正好也拿100cm去做上衣,那好,等甲做完上衣再做裤子的时候发现剩下的布(100cm)已经不够做裤子了…..这就是影响系统的性能,解决的办法就是给甲和乙一人一块300cm的布,就不会出现布被别人偷用的事情,也是就单实例和多实例的区别

如果设置成单例,那么多个线程会共享一个ActionContext和ValueStack,这样并发访问的时候就会出现问题了

struts 2的Action是多实例的并非单例,也就是每次请求产生一个Action的对象。原因是:struts 2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面。如果Action是单实例的话,这些数据在多线程的环境下就会相互影响,例如造成别人填写的数据被你看到了。所以Struts2的Action是多例模式的。

问题出现了,可以让struts2的action变成单例模式么?我在使用spring来生成action的时候,发现生成的action居然全是单例的。这不是让我的程序默认就跑出bug来么?上个用户提交的信息,如果下个用户没填,居然跑到上个用户输入的信息去了。

背景:

1) Struts2会对每一个请求,产生一个Action的实例来处理.

2) Spring的Ioc容器管理的bean默认是单实例的.

首先从数据安全性的问题上考虑,我们的Action应该保证是多例的,这样才不会出现数据问题。但是如果有的action比如只有admin才能操作,或者某些action,全站公用一个来提高性能,这样的话,就可以使用单例模式。

不过幸好,Spring的bean可以针对每一个设置它的scope,所以,上面的问题就不是问题了。如果用多例,就在spring的action bean配置的时候设置scope=”prototype”.好吧,问题到此结束。

我们看完了以上详解Struts中的Action 单例与多例介绍,爱站技术频道小编不管在什么时候都会给大家带来诸多专业知识,希望能帮到您。

上一篇:jsp输出所有请求头的名称方法

下一篇:JSP 开发SSH整合异常解决办法

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载