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".好吧,问题到此结束。
<!--多例--> <bean id="localFileTaskConFigureAction" class="com.top.fgap.localfiletask.action.LocalFileTaskConAction" scope="prototype"> <property name="localFileTaskConfigureService"> <ref bean="localFileTaskConfigureService"/> </property> </bean> <!--默认情况下是单例--> <bean id="locFTIpFilterAction" class="com.top.fgap.localfiletask.action.LocFTIpFilterAction"> <property name="localIpFilterService"> <ref bean="locFTIpFilterService"/> </property> </bean>
相关推荐
例如,在Struts2中,action必须用多例,因为action本身含有请求参数的值,即可改变的状态。而在Struts1中,action则可以用单例,因为请求参数的值是放在actionForm中,而非action中的。 五、注意事项 并不是说...
总之,Struts2中的Action单例与多例的问题实际上是Web应用设计时要平衡性能与数据安全的一个典型例子。了解并掌握这两种模式的特点及其适用场景,对于设计出既高效又安全的Web应用至关重要。而熟练使用Spring的IoC...
很经典的struts2开发实例,其中的action类的写法可以教你很清楚的了解具体的调用过程回给你开发带来很大的帮助
配置文件(struts.xml)用于定义请求与Action的映射关系,以及Action的执行结果。 Hibernate是一个ORM框架,它允许开发者用面向对象的方式处理数据库操作,而无需关注底层的SQL语句。Hibernate通过实体类(Entity...
而 Struts2 改进了这一点,Action 类可以实现 Action 接口,也可以实现其他接口,提供了更多的灵活性。ActionSupport 类则提供了常用功能的实现,但 Action 接口并非强制,任何包含 execute 方法的普通 Java 对象...
### Struts2 与 Struts1 的核心区别 #### 一、架构设计及Action实现方式 **Struts1** 在架构上要求Action类必须继承一个特定的抽象基类,这限制了开发者的灵活性,同时也意味着所有的Action都需要遵循相同的生命...
Struts1 Action 是单例模式并且必须是线程安全的,因为仅有 Action 的一个实例来处理所有的请求。 5. Struts2 的配置文件: Struts2 的配置文件是 struts.xml,用于配置框架的各种设置,例如 Action 的映射、结果...
而在Struts2中,Action类可以实现Action接口,也可以实现其他接口,提供了更多的定制服务。此外,Struts2的ActionSupport基类提供了对常用接口的实现,使得Action对象的创建更加灵活,不再局限于Action接口,任何...
而Struts2的Action与容器解耦,尽管仍能访问请求和响应,但通过其他机制减少了对Servlet API的直接依赖,增强了可测试性。 测试方面,Struts1的Action由于execute方法直接暴露了Servlet API,测试通常需要依赖容器...
- **Struts2**: 相比之下,Struts2中的Action是多例的,每次请求都会创建一个新的Action实例,这样就避免了线程安全的问题。Struts2通过提供一个默认的基类`ActionSupport`,使得开发者可以很容易地继承这个类来创建...
而使用Struts 2-Spring 插件,Action 可以被配置为单例或多例模式,由Spring 容器控制其生命周期,从而优化性能。 6. **国际化与主题支持**:Spring 提供了强大的国际化和主题支持,整合后,Struts 2 的Action 可以...
- **依赖注入(DI)**:Struts2可以与Spring框架结合,利用Spring的DI特性管理Action实例,实现Action的单例或多例模式。 - **AOP(面向切面编程)**:Spring AOP可以与Struts2的拦截器结合,提供更灵活的业务逻辑...
### Struts1与Struts2的主要区别 #### 1. Action类的设计差异 - **Struts1**: 在Struts1框架中,Action类必须继承自一个抽象类`org.apache.struts.action.Action`。这种方式可能导致的问题是代码灵活性较低,尤其...
线程模型方面,Struts1的Action是单例模式,意味着所有请求共享同一个Action实例,因此开发者需要确保Action和其资源是线程安全的。相比之下,Struts2为每个请求创建新的Action实例,消除了线程安全问题,也简化了...
7. **struts2-spring-plugin**: 与Spring框架的集成,帮助管理Action的依赖注入,实现Action的单例或多例模式。 描述中提到,如果在导入项目时出现问题,可能是因为JDK版本过低。Struts2通常需要Java 8或更高版本来...
### Struts2与Struts1的主要区别 #### Struts2架构设计与实现方式 - **Struts2**在设计上采用了更加灵活的方式,每个请求都对应一个实例化的Action对象,而不是像**Struts1**那样在整个请求周期内共享同一个Action...
### Struts1与Struts2本质区别 #### 1. 在Action实现类方面的对比 - **Struts 1**:要求Action类必须继承一个抽象基类`Action`,这种设计方式意味着开发者必须按照预设的结构来编写代码,灵活性较低。这种通过抽象...