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”.好吧,问题到此结束。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
- laravel Validator ajax返回错误信息的方法
- Linux下 php7安装redis的办法
- php实现的数组转xml案例分析
- Laravel框架Auth用户认证操作实例分析
- yii2实现Ueditor百度编辑器的示例代码
- PHP下载文件函数与用法示例
- php实现银联商务公众号+服务窗支付的示例代码
- php使用json-schema模块实现json校验示例
- 17个品牌,113款5G手机,5G离我们越来越近。
- PHP的cookie与session原理及用法详解
- Thinkphp5.0框架视图view的循环标签用法示例
- Thinkphp5.0 框架视图view的比较标签用法分析
- laravel 操作数据库常用函数的返回值方法
- laravel 验证错误信息到 blade模板的方法