SSH整合开发时Scope为默认时现象与原理

1.前提知识


1)scope默认值

进行SSH整合开发时,Struts2的action须要用spring容器进行管理,仅仅要涉及到类以bean的形式入到spring容器中。无论是xml配置还是使用注解方式进行配置,都会涉及到spring管理bean的scope。其一共同拥有五种取值,而其默认值为singleton。也就是单例模型,全部对此bean引用为同一个对象。

2)action应为多例

struts2作为MVC中视图(View)层框架,其最主要任务就是接收用户请求。然后调用业务逻辑层进行处理,这样的特征也就是意味着每一个HTTP请求都必须相应一个单独的action,不然会出现数据冲突。

3)那么问题来了

通过上述两点能够看出两者是矛盾的,所以当spring须要管理action时,就必须更改其scope为prototype。而不是使用其默认值-singleton。

2.错误现象

进行用户加入时,假设spring管理action的方式为默认值(singleton)就会造成加入完用户后,当进行再次加入时发现数据进行自己主动回显(前提使用了struts2标签而且使用了ModelDriven),无论是关闭浏览器还是换其他浏览器都是如此,使用<s:debug>标签调用时,发现值栈的root栈的栈顶就是之前加入的用户(model)。


3.原因分析

1)spring容器启动

spring容器启动时。会创建加入用户action的实例,由于其scope为singleton方式,所以以后每次请求此action都会调用同一个action对象,由此也埋下了灭亡的种子。

2)经过modelDriven拦截器

用户在输入完信息,点击提交。

由于加入用户须要对表单输入数据进行封装。此时採用了封装数据最标准的做法实现ModelDriven接口,那么当请求加入的action时,会经过modelDriven拦截器,此拦截器通过getModel方法获取目标model然后push到valuestack的栈顶;


2)经过param拦截器

当经过拦截器params时,其会对栈顶的model进行赋值。

3)运行action

运行加入action进行加入操作。而且完毕兴许。


4)再次请求加入action转发

此时又从spring容器中取出加入的action,因为其scope为singleton,所以此action与之前的action为同一个,而此前加入的还保存在action中。


5)再次经过modelDriven拦截器

再次经过拦截器modelDriven,此时action中的model再次被放到valuestack的栈顶,再次提醒model中是有值的。

6)到达界面

到达界面时,就会依据model中值进行回显。


原文地址:https://www.cnblogs.com/mfmdaoyou/p/7131915.html