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. IIS 配置 SVC

    IIS8中添加WCF支持几种方法小结[图文] 方法一 最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不 ...

  2. [转]在 Linux 下使用 RAID

    转自:http://www.linuxidc.com/Linux/2015-08/122191.htm RAID 的意思是廉价磁盘冗余阵列(Redundant Array of Inexpensive ...

  3. Java中 == 和 equals()

    记住三句话 1. 语义上:==指的是内存引用一样.equals是指的是逻辑相等.逻辑相等具体的意思由编写者决定(即在引用类型中,"=="是比较两个引用是否指向堆内存里的同一个地址( ...

  4. Manacher 学习笔记

    \(\\\) \(Manacher\) 一种常用的字符串算法,用于处理一些回文字符相关的问题. 回文串:从前向后和从后向前输出一致. 回文中心:以这里开始,每次向外左右各扩展一个字符得到的回文串的中心 ...

  5. Angular——表单指令

    基本介绍 这些指定只能针对input标签 基本使用 <!DOCTYPE html> <html lang="en"> <head> <me ...

  6. ubuntuKylin17.04重装KDE

    不小心安装了一个不知道什么的东西,把libROS的那一套都给卸载了,然后删除掉了KDE的很多库.然后KDM也丢失了.KDE界面启动之后,plasma-desktop界面也启动不了.选择重装. 然而出现 ...

  7. 项目关联到svn

    最近因为要升级项目,改用64位的eclipse,原先已经被svn管理的项目需要被复制到另一个工作空间,只需要导入并复制项目到新的工作空间即可 右键,点import 选择已经存在的项目导入工作空间 选择 ...

  8. sratookit

    sratookit 下载后解压 tar -zxvf sratoolkit.2.8.2-1-ubuntu64.tar.gz 移动到专门安装生物信息软件的目录下 mv sratoolkit.2.8.2-1 ...

  9. Cesium学习笔记(四)Camera

    http://blog.csdn.net/HobHunter/article/details/74909641 Cesium 相机控制场景中的视野.操作相机的方法有很多,如旋转,缩放,平移和飞到目的地 ...

  10. Altium Designer 2017 ActiveRoute使用以及其他技巧

    ActiveRoute 点击右下角PCB->PCB ActiveRoute调出ActiveRoute面板 在设计电路时,有一堆细小的白色线,表示几个脚之间需要连接,按住键盘Alt + 鼠标左键, ...