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中值进行回显。


SSH整合开发时Scope为默认时现象与原理的更多相关文章

  1. 【转载】Ssh整合开发介绍和简单的登入案例实现

    Ssh整合开发介绍和简单的登入案例实现 Ssh整合开发介绍和简单的登入案例实现 一  介绍: Ssh是strtus2-2.3.1.2+ spring-2.5.6+hibernate-3.6.8整合的开 ...

  2. 从MVC和三层架构说到SSH整合开发

    相信很多人都认同JavaWeb开发是遵从MVC开发模式的,遵从三层架构进行开发的,是的,大家都这么认同.但是相信大家都会有过这样一个疑问,if(MVC三层模式==三层架构思想)out.println( ...

  3. ssh整合开发

    ssh整合思想 ssh整合 第一步:导入ssh相关jar包 第二步:搭建struts环境   (1)创建 action  struts.xml配置文件, 配置action struts.xml约束 & ...

  4. 从MVC和三层架构说到ssh整合开发-下

    这章主要讲整合开发,直接从实战讲起,对与ssh的单方面了解,请继续等待我的兴许文章. 解说不到位的地方欢迎大家指正:联系方式rlovep.com 具体请看源码凝视: 全部代码下载(csdn):链接 G ...

  5. SSH整合开发的web.xml配置

    <?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" ...

  6. Java Web整合开发实战:基于Struts 2+Hibernate+Spring 目录

    第1篇 Java Web开发基础第1章 Web的工作机制( 教学视频:31分钟) 1.1 理解Web的概念 1.1.1 Web的定义 1.1.2 Web的三个核心标准 1.2 C/S与B/S两种软件体 ...

  7. Hibernate 注解时 hibernate.hbm.xml的配置方法 以及与SSH整合里的配置方式

    ①纯Hibernate开发: 当你在Bean中写入注解后,需要告诉hibernate哪些类使用了注解. 方法是在hibernate.hbm.xml文件中配置 <!DOCTYPE hibernat ...

  8. 用ssh整合时,用sessionfactory的getCurrentSession()获取不到session

    在用ssh整合时,一开始用的是getCurrentSession(),获取当前线程上的session,但是总是抛异常,不能获取. 后来用sessionfactory的openSession(),但是, ...

  9. 已经在Git Server服务器上导入了SSH公钥,可用TortoiseGit同步代码时,还是提示输入密码?

    GitHub虽好,但毕竟在国内访问不是很稳定,速度也不快,而且推送到上面的源码等资料必须公开,除非你给他交了保护费:所以有条件的话,建议大家搭建自己的Git Server.本地和局域网服务器都好,不信 ...

随机推荐

  1. python抢票开发——设备预约助手实现

    女朋友是药学院的,做实验时需要在特定的网站上进行设备预约,由于预约人数过多,从而导致从浏览器登录不进去或者登录进去预约失败等情况,所以我用python帮她写了一个抢位助手,让程序自动去进行位置预定,实 ...

  2. drawable的文件名大写

    drawable的文件名大写导致的R文件消失!!!1

  3. ACM_最短网络(最小生成树)

    Problem Description: Farmer John has been elected mayor of his town! One of his campaign promises wa ...

  4. [转]android 获取 imei号码

    核心代码: Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)) .getDeviceId(); 1.加入权限 在manife ...

  5. 使用A*寻路小记

    前几天做另一个DEMO 要用实现自动寻路功能,看到普遍都是A* 学习了下 我的主循环代码: isFindEndPoint = false; //主循环 do { CreateOutSkirtsNode ...

  6. js中添加node.js语法支持

    File——>settings

  7. mysql和java的时间对应关系

    引用:http://blog.csdn.net/xinghuo0007/article/details/51500923 MySQL(版本:5.1.50)的时间日期类型如下: datetime 8by ...

  8. HTTP常见状态码(404、400、500)等错误

    一些常见的状态码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务不可用 详细分解: 1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明 ...

  9. 基于zk“临时顺序节点“的分布式锁

    import org.apache.zookeeper.*; import org.apache.zookeeper.data.Stat; import java.io.IOException; im ...

  10. PC、h5项目接入第三方支付宝扫码登录、扫码付款

    首先介绍一下pc项目接入支付宝扫码支付. 1.pc.移动接入支付宝扫码支付. 其实这个逻辑很简单,前端所需要处理的不是很多,后台会给一个连接,前端只需要将要支付的订单id拼接在这个连接上,然后打开跳转 ...