`
guo2168
  • 浏览: 9987 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Struts1与Struts2的线程安全问题

阅读更多
   总的来说,Struts1的Action是单例模式,因此应用开发者必须保证它是线程安全的或者是同步的,因为Struts1中的每个Action仅有一个实例来处理所有请求。
   但是在用Struts1开发时并没有考虑到线程安全问题,这是因为我们在anction中使用的基本都是局部变量,而"局部变量是线程安全的。因为每执行一个方法,都会在独立的空间创建局部变量,它不是共享资源,局部变量包括方法的参数变量".
   在Struts1中,所有的变量都是定义在action中我们要执行的方法里的(Action中的excute方法或DispachterAction中指定要执行的方法),我们用于封装客户端请求参数的ActionForm,也是作为一个参数传入的,也属于局部变量,因此也不存在线程安全问题。

  Struts2  的Anction对象为每一个请求产生一个实例,因此虽然在Action中定义了很多全局变量,也不存在线程安全问题。
Struts2框架在处理每一个用户请求的时候,都建立一个单独的线程进行处理,值栈ValueStack也是伴随着局部线程而存在 的,在该线程存在的过程中,可以随意访问值栈,这就保证了值栈的安全性。

在Struts2中,ActionContext是一个局部线程,这就意味着每个线程中的ActionContext内容都是唯一的,所以开发都不用担心Action的线程安全。
分享到:
评论
13 楼 walle1027 2011-01-24  
wuyakenihao 写道
alyouge 写道
wuxi7227 写道
alyouge 写道
在 spring 和 struts 2 整合的时候, 如果不写上scope="prototype" 那么就是ACTION就是单例的,如果定义全局变量,当第一次传递过去参数,以后访问如果不再传参数,默认的就是第一次传递过去的参数。所以ACTION 必须加上scope="prototype"。

或者谁有跟好的解决办法?


用spring来管理struts2的action有多大意义啊?本身不会被其他bean引用的;想引用其他bean,一样可以注入的。


不用spring 你怎么注入SERVICE?



不注入也可以,你想想在你的过滤器或者servlet 中你是如何去spring中bean 的。当然 如果你使用spring 的话,最好都交给spring 来进行管理。


写在父类的构造方法里面
public abstract class BaseAction<M,S> extends ActionSupport implements ModelDriven<M>{ 
    protected M model;
    protected S service;
    public BaseAction(){
       Class<S> s = (Class<S>)((ParameterizedType)getClass.getGenericSupperclass())
                 .getActualTypeArguments()[1];
       service = (S) applicationContext.getBean(s);
       Class<M> m =(Class<S>)((ParameterizedType)getClass.getGenericSupperclass())
           .getActualTypeArguments()[0];
       try{
         model = m.newInstance();
       }catch(Exception e){
       }
    }
   public final M getModel(){
      return model;
   }

}
12 楼 wuxi7227 2011-01-18  
无语。第一种方法效果相同,但是省事呀。你愿意按你的老方法去配action bean那就老方法吧。 
11 楼 alyouge 2011-01-14  
wuxi7227 写道
alyouge 写道
wuxi7227 写道
alyouge 写道
wuxi7227 写道
alyouge 写道
在 spring 和 struts 2 整合的时候, 如果不写上scope="prototype" 那么就是ACTION就是单例的,如果定义全局变量,当第一次传递过去参数,以后访问如果不再传参数,默认的就是第一次传递过去的参数。所以ACTION 必须加上scope="prototype"。

或者谁有跟好的解决办法?


用spring来管理struts2的action有多大意义啊?本身不会被其他bean引用的;想引用其他bean,一样可以注入的。


不用spring 你怎么注入SERVICE?


直接在action里注入service 引用。 service配置文件default-autowire="byName" 就OK了呀。哦,还有,Struts的配置文件 <constant name="struts.objectFactory" value="spring" />  这样就不用在配置文件配action了。

还有一种传统方法,直接去ServletContext取。
public Object getBean(String name) {
        ApplicationContext ctx =
       WebApplicationContextUtils.getRequiredWebApplicationContext(ServletActionContext.getServletContext());
        return ctx.getBean(name);
    }

哦 原来你说的这样啊 ,还不是离不开SPRING


采用第二种方法的话,action就跟spring没关系了呀。 把那个方法写到一个BaseAction里就好了。 即使第一种,不需要在配置文件里写了,也省事很多。 不正是你在找的其它方法么。


一般情况下,我估计没人这么干吧,最起码我不会这么干!这么说HIBERNATE你也可以这样写了,那还要SPRING干嘛?
10 楼 wuxi7227 2011-01-14  
alyouge 写道
wuxi7227 写道
alyouge 写道
wuxi7227 写道
alyouge 写道
在 spring 和 struts 2 整合的时候, 如果不写上scope="prototype" 那么就是ACTION就是单例的,如果定义全局变量,当第一次传递过去参数,以后访问如果不再传参数,默认的就是第一次传递过去的参数。所以ACTION 必须加上scope="prototype"。

或者谁有跟好的解决办法?


用spring来管理struts2的action有多大意义啊?本身不会被其他bean引用的;想引用其他bean,一样可以注入的。


不用spring 你怎么注入SERVICE?


直接在action里注入service 引用。 service配置文件default-autowire="byName" 就OK了呀。哦,还有,Struts的配置文件 <constant name="struts.objectFactory" value="spring" />  这样就不用在配置文件配action了。

还有一种传统方法,直接去ServletContext取。
public Object getBean(String name) {
        ApplicationContext ctx =
       WebApplicationContextUtils.getRequiredWebApplicationContext(ServletActionContext.getServletContext());
        return ctx.getBean(name);
    }

哦 原来你说的这样啊 ,还不是离不开SPRING


采用第二种方法的话,action就跟spring没关系了呀。 把那个方法写到一个BaseAction里就好了。 即使第一种,不需要在配置文件里写了,也省事很多。 不正是你在找的其它方法么。
9 楼 alyouge 2011-01-13  
wuxi7227 写道
alyouge 写道
wuxi7227 写道
alyouge 写道
在 spring 和 struts 2 整合的时候, 如果不写上scope="prototype" 那么就是ACTION就是单例的,如果定义全局变量,当第一次传递过去参数,以后访问如果不再传参数,默认的就是第一次传递过去的参数。所以ACTION 必须加上scope="prototype"。

或者谁有跟好的解决办法?


用spring来管理struts2的action有多大意义啊?本身不会被其他bean引用的;想引用其他bean,一样可以注入的。


不用spring 你怎么注入SERVICE?


直接在action里注入service 引用。 service配置文件default-autowire="byName" 就OK了呀。哦,还有,Struts的配置文件 <constant name="struts.objectFactory" value="spring" />  这样就不用在配置文件配action了。

还有一种传统方法,直接去ServletContext取。
public Object getBean(String name) {
        ApplicationContext ctx =
       WebApplicationContextUtils.getRequiredWebApplicationContext(ServletActionContext.getServletContext());
        return ctx.getBean(name);
    }

哦 原来你说的这样啊 ,还不是离不开SPRING
8 楼 wuxi7227 2011-01-13  
alyouge 写道
wuxi7227 写道
alyouge 写道
在 spring 和 struts 2 整合的时候, 如果不写上scope="prototype" 那么就是ACTION就是单例的,如果定义全局变量,当第一次传递过去参数,以后访问如果不再传参数,默认的就是第一次传递过去的参数。所以ACTION 必须加上scope="prototype"。

或者谁有跟好的解决办法?


用spring来管理struts2的action有多大意义啊?本身不会被其他bean引用的;想引用其他bean,一样可以注入的。


不用spring 你怎么注入SERVICE?


直接在action里注入service 引用。 service配置文件default-autowire="byName" 就OK了呀。哦,还有,Struts的配置文件 <constant name="struts.objectFactory" value="spring" />  这样就不用在配置文件配action了。

还有一种传统方法,直接去ServletContext取。
public Object getBean(String name) {
        ApplicationContext ctx =
       WebApplicationContextUtils.getRequiredWebApplicationContext(ServletActionContext.getServletContext());
        return ctx.getBean(name);
    }
7 楼 alyouge 2011-01-13  
wuyakenihao 写道
alyouge 写道
wuxi7227 写道
alyouge 写道
在 spring 和 struts 2 整合的时候, 如果不写上scope="prototype" 那么就是ACTION就是单例的,如果定义全局变量,当第一次传递过去参数,以后访问如果不再传参数,默认的就是第一次传递过去的参数。所以ACTION 必须加上scope="prototype"。

或者谁有跟好的解决办法?


用spring来管理struts2的action有多大意义啊?本身不会被其他bean引用的;想引用其他bean,一样可以注入的。


不用spring 你怎么注入SERVICE?



不注入也可以,你想想在你的过滤器或者servlet 中你是如何去spring中bean 的。当然 如果你使用spring 的话,最好都交给spring 来进行管理。


不明白你什么意思“你想想在你的过滤器或者servlet 中你是如何去spring中bean 的”
6 楼 wuyakenihao 2011-01-13  
alyouge 写道
wuxi7227 写道
alyouge 写道
在 spring 和 struts 2 整合的时候, 如果不写上scope="prototype" 那么就是ACTION就是单例的,如果定义全局变量,当第一次传递过去参数,以后访问如果不再传参数,默认的就是第一次传递过去的参数。所以ACTION 必须加上scope="prototype"。

或者谁有跟好的解决办法?


用spring来管理struts2的action有多大意义啊?本身不会被其他bean引用的;想引用其他bean,一样可以注入的。


不用spring 你怎么注入SERVICE?



不注入也可以,你想想在你的过滤器或者servlet 中你是如何去spring中bean 的。当然 如果你使用spring 的话,最好都交给spring 来进行管理。
5 楼 白糖_ 2011-01-13  
alyouge 写道
在 spring 和 struts 2 整合的时候, 如果不写上scope="prototype" 那么就是ACTION就是单例的,如果定义全局变量,当第一次传递过去参数,以后访问如果不再传参数,默认的就是第一次传递过去的参数。所以ACTION 必须加上scope="prototype"。

或者谁有跟好的解决办法?



项目里就用这种方式,而且据说struts1与spring整合后,配上scope="prototype"也成为多线程的了。
4 楼 kyfxbl 2011-01-12  
alyouge 写道
在 spring 和 struts 2 整合的时候, 如果不写上scope="prototype" 那么就是ACTION就是单例的,如果定义全局变量,当第一次传递过去参数,以后访问如果不再传参数,默认的就是第一次传递过去的参数。所以ACTION 必须加上scope="prototype"。

或者谁有跟好的解决办法?


你说的这个就是标准的解决方法
3 楼 alyouge 2011-01-12  
wuxi7227 写道
alyouge 写道
在 spring 和 struts 2 整合的时候, 如果不写上scope="prototype" 那么就是ACTION就是单例的,如果定义全局变量,当第一次传递过去参数,以后访问如果不再传参数,默认的就是第一次传递过去的参数。所以ACTION 必须加上scope="prototype"。

或者谁有跟好的解决办法?


用spring来管理struts2的action有多大意义啊?本身不会被其他bean引用的;想引用其他bean,一样可以注入的。


不用spring 你怎么注入SERVICE?
2 楼 wuxi7227 2011-01-12  
alyouge 写道
在 spring 和 struts 2 整合的时候, 如果不写上scope="prototype" 那么就是ACTION就是单例的,如果定义全局变量,当第一次传递过去参数,以后访问如果不再传参数,默认的就是第一次传递过去的参数。所以ACTION 必须加上scope="prototype"。

或者谁有跟好的解决办法?


用spring来管理struts2的action有多大意义啊?本身不会被其他bean引用的;想引用其他bean,一样可以注入的。
1 楼 alyouge 2011-01-12  
在 spring 和 struts 2 整合的时候, 如果不写上scope="prototype" 那么就是ACTION就是单例的,如果定义全局变量,当第一次传递过去参数,以后访问如果不再传参数,默认的就是第一次传递过去的参数。所以ACTION 必须加上scope="prototype"。

或者谁有跟好的解决办法?

相关推荐

    struts1,struts2,webwork,线程安全问题

    struts1,struts2,webwork,线程安全问题,easy518网 http://www.easy518.com/

    servlet与Struts action线程安全问题分析

    servlet与Struts action线程安全问题分析

    Struts1与Struts2本质区别

    Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。 3 Servlet依赖方面的对比:Struts 1 Action依赖于Servlet API,因为Struts 1 Action的execute方法中有HttpServletRequest和...

    servlet与Struts action线程安全问题分析(pdf)

    servlet与Struts action线程安全问题分析 &lt;br&gt;===================================================== Servlet的线程安全问题只有在大量的并发访问时才会显现出来,并且很难发现,因此在编写Servlet程序时要...

    转:struts1与struts2的区别

    struts1与struts2的区别,线程模式,servlet的依赖...

    Struts线程安全

    struts线程安全,里面讲述了struts中的一些关于线程的安全方面的介绍。

    Struts2与struts1不同

    Struts2和Struts1的不同  Action 类: 线程模式:

    java struts2学习笔记之线程安全

    主要为大家详细介绍了java struts2学习笔记之线程安全,感兴趣的朋友可以参考一下

    Struts中action线程安全问题解析

    主要介绍了Struts中action线程安全问题解析,涉及实例代码,还是挺不错的,具有一定参考价值,需要的朋友可以了解下。

    struts1和struts2区别

    不同点 Action 类 线程模式 Servlet 依赖 可测性 捕获输入 表达式语言 绑定值到页面(view) 类型转换 校验 Action执行的控制 文档更详细……

    Struts2与Struts1的对比

    Struts2与Struts1的对比 对Action 类、线程模式、捕获输入、表达式语言、 绑定值到页面(view)、类型转换、Action执行的控制 等等读做了解析.

    Struts 2 全版本漏洞检测工具 18.09 过waf版

    5、作者对不同的struts2漏洞测试语句做了大量修改,执行命令、上传功能已经能通用。 6、支持HTTPS。 7、支持GET、POST、UPLOAD三种请求方法,您可以自由选择。(UPLOAD为Multi-Part方式提交) 8、部分漏洞测试支持...

    struts1的服务器端验证

    struts1的服务器端验证,一个很好的验证配置文件,线程安全问题有保障

    struts2 会话技术

    深入剖析struts2 的各种存储数据的范围,解析因为存储范围混乱而导致的线程混乱, 解决web开发总的界面跳转混乱问题

    struts2 annotation 批量下载

    通过产生临时文件下载之后,再通过线程删除临时文件

    Spring并发访问的线程安全性问题.docx

    springmvc的controller是singleton的(非线程安全的),这也许就是他和struts2的区别吧和Struts一样,Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了...

    Struts 2.0

    清晰的介绍了Struts 2.0框架的工作流程,Action线程安全,程序入口,配置文件。

    Struts1与Struts2的12点区别

    1) 在Action实现类方面的对比 2) 线程模式方面的对比 3) Servlet依赖方面的对比...

Global site tag (gtag.js) - Google Analytics