struts2中Action单例和多例

struts2的action是多实例的,也就是每次请求产生一个Action对象。因为:struts2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面。如果Action是单实例的话,这些数据在多线程的环境下就会相互影响,例如造成别人填写的数据被你看到了。而struts1的Action是单实例的,因为他的数据保存在Form类中,多线程环境下,Action只负责处理一些逻辑,并没有数据,也就是大家把它当做一个工具使用。同样servlet也是单实例的。
项目采用了Struts2+Spring的装配模式,Spring管理Struts2的Action自动设置为单例。这样Action的生命周期为服务器的生命周期,也就是说不关闭服务器,Action一直存在,Action中的属性也一直存在。
这种现象好处在于,分页对象所需要的数据对象存在于Action中是不被销毁的直到页面重新对数据对象输入查询条件。
这样做的缺点在于,一,两个浏览器同时操作一个页面,会在查询等条件的保存上产生冲突,致使A浏览器的查询条件影响到B浏览器的查询结果;二,没有良好设计的系统中,重用Action和多次利用Action的时候无法有效甄别数据的有效性。

因此思考是否可以通过一些办法来解决此类问题。
办法一:设置Action bean的生命周期为Session,即每个浏览器的打开影响着一套Action的生命周期,解决不同用户互相影响的问题;
(通常和spring整合使用的时候,在struts.xml文件要配置一个元素 或者在struts.property文件中配置 struts.objectFactory = spring 。。。可以在spring的配置文件中的bean元素里用一个scope属性来配置action是用什么生命周期,singleton,prototype,request,session等等)
办法二:通过设置过滤器或者拦截器,或者设置类中的单独属性,判断查询条件是否由理想对象传来,如果不是则销毁值对象,如果是则继承值对象的查询条件。
一些关于拦截器的资料:http://blog.csdn.net/feng_sundy/archive/2007/10/11/1820668.aspx

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值