论坛首页 Web前端技术论坛

Struts1与Struts2的线程安全问题

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

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

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

或者谁有跟好的解决办法?
0 请登录后投票
   发表时间:2011-01-12  
alyouge 写道
在 spring 和 struts 2 整合的时候, 如果不写上scope="prototype" 那么就是ACTION就是单例的,如果定义全局变量,当第一次传递过去参数,以后访问如果不再传参数,默认的就是第一次传递过去的参数。所以ACTION 必须加上scope="prototype"。

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


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

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


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


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

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


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

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



项目里就用这种方式,而且据说struts1与spring整合后,配上scope="prototype"也成为多线程的了。
0 请登录后投票
   发表时间: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 来进行管理。
0 请登录后投票
   发表时间: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 的”
0 请登录后投票
   发表时间:2011-01-13   最后修改: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);
    }
0 请登录后投票
   发表时间: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
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics