为什么struts2的action是线程安全的,struts1的action不是线程安全的? 
先对struts1和struts2的原理做一个简单的讲解

对于struts1 ,当第一次**.do的请求过来时,在内存中的actionmapping中找到相对应的action,然后new出这个action放在缓存中,当第二 次一样的请求过来时,还是找的这个action,所以对于struts1来说,action是单实例的 ,只有一个,如果在action中定义变量,就要非常小心了,因为并发问题,可能带来灾难性的后果,也不是不可以,我们可以加锁达到同步,只是在性能上就 要折衷了。

另外说几句 ,当struts交由spring管理的时候 ,spring的bean配置默认是单例的 , 
如果action是有状态的 ,必须显示的配置为prototype

1 <bean id= "saveUserAction"   class = "com.test.action.user.SaveUserAction"  scope= "prototype" >
2     <property name="service"  ref= "userService" ></property>
3 </bean>  

下面是struts1.2的源码: 
当请求过来时,去找指定的action,如果有就直接取出来,如果没有就new一个新的action放到map中。

1 Java代码  收藏代码
2
3     /**
4      * The set of Action instances that have been created and
5      * initialized, keyed by the fully qualified Java class name of the
6      * Action class.
7      */
8     protected HashMap actions = new HashMap();      

processActionCreate这个方法里去一窥究竟吧: 
1、先获取类名 
2、根据类名去一个名为actions的map里查寻实例是否已经存在 
3、如果存在,则直接返回 
4、如果不存在,则创建一个新实例 
5、把创建好的action放到map里备用

 1 Java代码  收藏代码
 2
 3     protected Action processActionCreate(HttpServletRequest request,
 4                                              HttpServletResponse response,
 5                                              ActionMapping mapping)
 6             throws IOException {
 7
 8             // Acquire the Action instance we will be using (if there is one)
 9             String className = mapping.getType();//1、先获取类名
10             ...
11             Action instance = null;
12             synchronized (actions) {
13
14                 // Return any existing Action instance of this class
15                 instance = (Action) actions.get(className);//2、根据类名去map里查寻实例是否已经存在
16                 if (instance != null) {
17                     return (instance); //3、如果存在,则直接返回
18                 }
19
20                 // Create and return a new Action instance
21                 //4、如果不存在,则创建一个新实例
22                 instance = (Action) RequestUtils.applicationInstance(className)
23
24                 instance.setServlet(this.servlet);
25                 actions.put(className, instance);//5、把创建好的action放到map里
26             }
27             ...
28             return (instance);
29
30         }     

struts2 在struts1的基础上做了改进 ,对于struts2 ,每次请求过来都会new一个新的action , 所以说struts2的action是线程安全的 , 但同时也带来一个问题,每次都new一个action ,这样action的实例太多 , 在性能方面还是存在一定的缺陷的。

转载于:https://www.cnblogs.com/mamama/p/4348505.html

struts 的action 线性安全问题相关推荐

  1. struts中action名称反复导致的神秘事件

    近期由于项目需求变更.须要本人对当中的某个业务功能进行改动.本人依照前台页面找action,依据action找代码的逻辑进行了改动(公司项目是ssh框架,struts配置全部是通过注解的方式进行.配置 ...

  2. struts一个action处理多个方法

    2019独角兽企业重金招聘Python工程师标准>>> 在前面的介绍中,我们了解了struts的action是实现execute()方法来完成业务逻辑的,可是,在实际开发中,让一个业 ...

  3. Struts中Action三种接收参数的方式?

    前言: 前面已经有一篇随笔介绍了Struts2的大概原理.本文就Struts2中Action与jsp页面进行数据对接时介绍几种常见方法! 值栈ValueStack 3个Action Action1 p ...

  4. struts中action与页面之间的传值方式

    1.默认配置下的excute方法传值 如何把登陆页面中的用户名传递到登录成功的页面中呢? 有三种方式, 1,使用默认的action的传递方式. 2,自定义一个vo,在action中使用这个vo 3,使 ...

  5. Struts2的配置 struts.xml Action详解

    在学习struts的时候,我们一定要掌握struts2的工作原理.只有当我们明确了在struts2框架的内部架构的实现过程,在配置整个struts 的框架时,可以很好的进行逻辑上的配置.接下来我就先简 ...

  6. struts 普通的action

    1.使用普通方式javaBean作为Action动作类,不需要继承任何父类,也不需要实现接口. l 方法一定是public公用的, l 返回值是字符串用来决定跳转到哪个视图 l 不需要参数 l 方法名 ...

  7. 文件上传在Struts的Action检测文件类型

    在页面有文件上传的表单.(只能上传jpg/png文件) 检测根据文件的文件头(不是后缀名)判断文件类型 一.Struts2文件上传  实现规则: (1)在JSP中设定表单控件<s:file na ...

  8. struts的action访问servlet的IOC方式与非IOC方式

    这是IOC方式,要实现相应接口 package loginAction; import com.opensymphony.xwork2.ActionSupport; import javax.serv ...

  9. Struts(七):action配置文件之通配符映射

    通配符映射:一个Web应用可能有成百上千个action声明,可以使用struts提供的通配符映射机制把多个彼此相似的映射关系简化为一个映射关系. 通配符映射规则: 若找到多个匹配,没有通配符的那个将胜 ...

最新文章

  1. seo关键词互点软件报价_seo关键词优化软件如何收费
  2. 国家五部委联合发布“AI标准顶层设计”:2021年明确、2023年初步建成
  3. 组合数学题 Codeforces Round #108 (Div. 2) C. Pocket Book
  4. fileinput 图片上传
  5. 【渝粤题库】陕西师范大学200781 数据库原理及应用 作业
  6. 前端学习(3001):vue+element今日头条管理--项目初始化总结
  7. cocos2d-x 截取屏幕可见区域
  8. Java提高班(二)深入理解线程池ThreadPool
  9. IE DOM中Frame的使用
  10. SqlServer彻底卸载,适用于任何版本,亲测了n次都可用
  11. docker 部分常用镜像下载及安装
  12. android 开发种子文件,IT之家学院:如何制作种子文件和磁力链接
  13. H.264 AVC 编解码标准
  14. linux下usb无线网卡对比
  15. 2021年美容师(初级)免费试题及美容师(初级)考试试卷
  16. ui设计师色彩运用_网页设计师的20多种色彩工具
  17. linux系统Centos7更换下载源阿里云
  18. 使用D3D8实现2D图形显示技术
  19. Roberts边缘检测算子
  20. C#通过ip地址取当前城市

热门文章

  1. 集成sleuth_Spring Cloud集成ELK、采用RabbitMQ收集Zipkin数据
  2. 循环序列模型 —— 1.10 长短期记忆(LSTM)
  3. leetcode - 264. 丑数 II
  4. 百面机器学习第一章——特征工程(基本是百面机器学习书的内容)
  5. 去哪儿-14-vuex_localstorage
  6. Java如何将指定字符串转化为指定日期格式
  7. 设计模式学习笔记——观察者(Observer)模式
  8. toj 4601 好老师
  9. 算法分析--数量级比较
  10. mybatis oracle 大写,解决mybatis用Map返回的字段全变大写的问题