`
guo2168
  • 浏览: 10144 次
  • 性别: 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,线程安全问题

    #### 二、Struts2与线程安全问题 Struts2框架设计时充分考虑了线程安全问题,主要体现在其默认使用“prototype”作用域来管理`Action`类实例,这意味着每次请求都会创建一个新的`Action`实例。 - **Struts2中...

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

    Struts2框架提供了多种策略来处理线程安全问题,包括Action实例的多例模式、使用拦截器进行同步控制等。开发者需要理解框架的工作原理,并结合最佳实践来避免线程安全问题。 总之,理解和处理Servlet和Struts ...

    Struts2与Struts1区别

    相比之下,Struts2 为每个请求创建一个新的 Action 实例,避免了线程安全问题。 3. **对 Servlet API 的依赖**: - Struts1 的 Action 直接依赖于 Servlet API,请求和响应对象会传入 execute 方法。而 Struts2 ...

    struts2 与 struts1的区别

    这种多例模式避免了线程安全问题,并且使得Action的开发变得更加简单直接。 #### 三、Servlet依赖性 - **Struts1** 的Action类依赖于Servlet API,因为每一次Action调用都会将`HttpServletRequest`和`...

    struts1和struts2的区别

    - **Struts2**: Struts2中的Action更像是工厂模式下的产品,每个Action实例都是线程安全的。Struts2提供了ActionSupport基类来简化Action的实现。Action本身可以是任何实现了特定接口的Java对象,甚至是普通的POJO。...

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

    ### servlet与Struts action线程安全问题分析 #### 一、引言 随着互联网应用的不断普及和发展,基于Servlet和JSP技术的应用程序在企业级应用中占据着重要的位置。Servlet作为一种常用的技术栈,因其多线程运行特性...

    转:struts1与struts2的区别

    - **Struts2**: 在Struts2中,为每个HTTP请求创建一个新的Action实例,从而避免了线程安全问题。这一改变极大地简化了代码编写,并降低了出错的可能性。尽管servlet容器会为每个请求创建多个临时对象,但并不会对...

    Struts2和Struts1的区别,详细点,主要说说Struts2

    ### Struts2与Struts1的主要区别 #### Struts2架构设计与实现方式 - **Struts2**在设计上采用了更加灵活的方式,每个请求都对应一个实例化的Action对象,而不是像**Struts1**那样在整个请求周期内共享同一个Action...

    Struts1与Struts2本质区别

    - **Struts 2**:每个请求都会创建一个新的Action实例,消除了线程安全问题,同时也减少了开发者在处理并发请求时需要考虑的问题。 #### 3. Servlet依赖方面的对比 - **Struts 1**:Action的方法签名中包含了`...

    struts1和struts2区别

    - **Struts2**:Action对象为每个请求创建一个新的实例,消除了线程安全问题,提高了性能。 3. **Servlet依赖**: - **Struts1**:Action直接依赖于Servlet API,需要HttpServletRequest和HttpServletResponse...

    struts1和struts2的区别(详细)

    这就导致了如果在Action中保存实例变量,则可能会出现线程安全问题。此外,Struts1中的Action类必须实现`Action`接口,并重写`execute`方法来处理请求。 - **Struts2**: 相比之下,Struts2中的Action是多例的,每次...

    Struts1和Struts2的区别和对比

    相比之下,Struts2为每个请求创建新的Action实例,消除了线程安全问题,也简化了开发流程。 在Servlet依赖上,Struts1的Action直接依赖于Servlet API,这意味着Action的execute方法接收HttpServletRequest和...

    struts1&struts2

    - **Struts2** 为每个请求创建新的Action实例,解决了线程安全问题,同时也更易于管理和测试。 5. **Servlet依赖** - **Struts1.x** 的Action类直接依赖于Servlet API,这使得测试变得更加困难。 - **Struts2** ...

    struts1与struts2本质区别

    - **Struts2**:每个请求都会创建一个新的Action实例,消除了线程安全问题。这种模式使得Action设计更加简单直接,减少了因线程安全考虑带来的额外工作。 #### 三、Servlet依赖的对比 - **Struts1**:Action类直接...

    Struts线程安全

    ### Struts线程安全概述 在探讨Struts框架下的线程安全问题之前,我们需要了解一些基础知识。Struts是一个用于构建企业级Java Web应用程序的开源框架,它基于MVC(Model-View-Controller)设计模式。在典型的Web...

    struts1与struts2的区别

    【Struts1与Struts2的区别】 Struts2框架并非完全独立的新框架,而是基于WebWork框架进行发展的。WebWork的稳定性和性能为Struts2提供了坚实的基础,使其成为一个融合了Struts1和WebWork优势的强大力量。在设计上,...

Global site tag (gtag.js) - Google Analytics