struts2中action是多例的,即一个session产生一个action
如果是单例的话,若出现两个用户都修改一个对象的属性值,则会因为用户修改时间不同,两个用户访问得到的属性不一样,操作得出的结果不一样.
举个例子:有一块布长度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".好吧,问题到此结束。
分享到:
相关推荐
例如,在Struts2中,action必须用多例,因为action本身含有请求参数的值,即可改变的状态。而在Struts1中,action则可以用单例,因为请求参数的值是放在actionForm中,而非action中的。 五、注意事项 并不是说...
为了理解这两种模式在Struts2中的实现与适用场景,我们需先了解单例模式和多例模式的基本概念及其在Web应用中的行为特点。 单例模式是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例...
- **Struts2**: 相比之下,Struts2中的Action是多例的,每次请求都会创建一个新的Action实例,这样就避免了线程安全的问题。Struts2通过提供一个默认的基类`ActionSupport`,使得开发者可以很容易地继承这个类来创建...
而使用Struts 2-Spring 插件,Action 可以被配置为单例或多例模式,由Spring 容器控制其生命周期,从而优化性能。 6. **国际化与主题支持**:Spring 提供了强大的国际化和主题支持,整合后,Struts 2 的Action 可以...
### Struts2 与 Struts1 的核心区别 #### 一、架构设计及Action实现方式 **Struts1** 在架构上要求Action类必须继承一个特定的抽象基类,这限制了开发者的灵活性,同时也意味着所有的Action都需要遵循相同的生命...
7. **struts2-spring-plugin**: 与Spring框架的集成,帮助管理Action的依赖注入,实现Action的单例或多例模式。 描述中提到,如果在导入项目时出现问题,可能是因为JDK版本过低。Struts2通常需要Java 8或更高版本来...
- **依赖注入(DI)**:Struts2可以与Spring框架结合,利用Spring的DI特性管理Action实例,实现Action的单例或多例模式。 - **AOP(面向切面编程)**:Spring AOP可以与Struts2的拦截器结合,提供更灵活的业务逻辑...
10. **生命周期管理**: Struts2中的Action实例默认为多例,但可以通过配置改为单例,以优化性能。同时,Struts2还支持Spring等依赖注入框架,方便管理Action的依赖关系。 深入学习Struts2的源码,有助于理解其运行...
- **请求处理**:Struts1中,每个Action实例是单例的,这意味着多个用户可能共享同一个Action实例,这在并发环境下可能会引发问题。 - **验证机制**:Struts1提供了内置的验证框架,但其使用相对复杂,且定制性较差...
2. **Action实例管理**:Spring可以管理Struts2 Action的生命周期,包括单例或多例模式的选择,提供更灵活的控制。 3. **结果映射**:Spring可以帮助配置Struts2的结果映射,使得视图层的跳转更加简洁。 4. **AOP...
- **Struts2**:Struts2采取了多例模式,即为每个请求创建一个新的`Action`实例。这种方式消除了线程安全问题,使得开发变得更加简单。由于现代Web容器能够高效地管理这些短生命周期的对象,因此这种方法不会造成...
通过使用Spring插件,我们可以让Spring管理Struts2的Action,这样Action实例的生命周期由Spring容器控制,可以实现Action的单例或多例模式。同时,Spring可以注入Action所需的其他服务,如DAO、Service等,使得整个...
- **Struts2**: Struts2中的Action采用了多例模式,即为每个HTTP请求创建一个新的Action实例。这种方式不仅简化了线程安全性的考虑,而且使得Action的开发更加直观。由于每个请求都有自己的Action实例,因此不需要...
9. **生命周期管理**:Struts2使用Servlet容器进行Action实例的生命周期管理,支持单例和多例模式,根据配置灵活选择。 10. **Action与表单绑定**:Struts2支持Action类与表单bean的自动绑定,使得HTTP请求参数能...
8. **生命周期管理**: Struts 2利用Spring等依赖注入框架管理Action实例的生命周期,实现了Action的单例或多例模式。这在`com/opensymphony/xwork2/inject`包下的类中有所体现。 9. **异常处理**: Struts 2提供了...
4. **Action实例创建**:Action实例通常是在请求到来时创建的,遵循单例或多例模式。如果配置为单例,那么Action在整个应用生命周期中只有一个实例;如果是多例,每次请求都会创建新的Action实例。 5. **ValueStack...
2. **统一管理**:Spring可以管理Struts2的Action实例,实现Action的单例或多例模式。 3. **事务管理**:Spring提供事务管理服务,可以方便地在Struts2 Action中进行事务控制。 4. **简化配置**:整合后,可以减少...
- **Struts2**:Action类采用多例模式,为每个HTTP请求创建一个新的Action实例。这种模式下,开发者不需要担心线程安全问题,可以更自由地管理Action中的状态。这种设计简化了开发流程,并提高了程序的可维护性。 #...