SpringMVC的controller和Struts2的action的scope区别

      SpringMVC的controller的scope默认是单例的,也就是scope=“singleton”,说白了就是不管你前台怎发请求,而我的controller是不会重新去new的,它与前台发的

请求有直接对应关系的是controller里面的各个方法,controller里面的各个方法时相互独立的,也就说每个方法独享request,response数据,方法之间是没有任何联系

的,方法之间不会共享参数变量的。同时springmvc处理请求时是通过servlet机制处理的,当前台请求发送到服务器时,被servlet拦截,请求是直接转发到controller类里面

的某个映射方法,其参数是通过框架注入进方法里面。


     而Struts2的action的scope默认是多例的,也就是scop=“prototype”,这个就说明了,你发了几个请求,我就给你生成几个action给你使用,至于你怎么用,我是不会管的,

请求是直接对应每个action的对象的,其action里面的方法虽然说也算是独立,但是前台传过来的数据是可以在各个方法之间进行共享的,这也是action为什么不能使用单例的

直接原因,action里面的属性值一般都是必须要有get和set方法,因为当前台请求被filter拦截后,框架会直接通过set方法直接注入到目标action类里面去的。


     说了这么多,说白了我的理解就是,由于action里面有各个参数的属性,所以你不能让它变成一个单例,而controller里面由于没有各个参数的属性,所以它默认是个单例

模式,而且每次请求把request中的参数直接注入到action里面的各个属性里和把参数注入到controller的方法里其实可以看成是差不多的,只不过区别是方法可以不用重新new,

而action必须要重新new。也就是说如果action里面没有那些参数属性的话,那么action.xml里面的scope也是能设置成单例的。


    对于上面那个为什么action里面有参数属性就不能变成单例的问题,我的理解是这样的,举个例子吧

一个盒子里有三个苹果,现在有甲乙两个人,甲乙两人同时访问的数量是三个,于是甲打算先拿一个,之后再拿两个

而乙正好在甲拿走一个后,从盒子里把剩下的两个给拿走了,而甲想后面再拿两个,这明显是不现实的。但是你假如

有两个箱子,箱子里都有两个苹果的话,那么不管乙怎么拿,都不会影响到甲的,同理甲怎么搞都影响不到乙的,这就是

为什么必须要用多例的原因。这个就说明了action是线程不安全的!

   以上只是我个人的一些浅薄理解,希望能得到各位大神的指正!



  


转载于:https://my.oschina.net/zswlist/blog/1503509

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值