这里有新鲜出炉的精品教程,程序狗速度看过来!
Struts 是 Apache 软件基金会(ASF)赞助的一个开源项目。它最初是 Jakarta 项目中的一个子项目,并在 2004 年 3 月成为 ASF 的顶级项目。它通过采用 JavaServlet/JSP 技术,实现了基于 Java EEweb 应用的 MVC 设计模式的应用框架,是 MVC 经典设计模式中的一个经典产品。
这篇文章主要介绍了 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". 好吧,问题到此结束。
来源: http://www.phperz.com/article/17/0821/338952.html