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

时间: 2024-10-19 11:26:27

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

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

相信很多人都认同JavaWeb开发是遵从MVC开发模式的,遵从三层架构进行开发的,是的,大家都这么认同.但是相信大家都会有过这样一个疑问,if(MVC三层模式==三层架构思想)out.println(“请继续观看……”) 1.MVC(MODEL-VIEW-CONTROLLER)设计模式: 首先让我们了解下MVC(Model-View-Controller)的概念: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写

从MVC和三层架构说到ssh整合开发-上

相信很多人都认同JavaWeb开发是遵从MVC开发模式的,遵从三层架构进行开发的,是的,大家都这么认同.但是相信大家都会有过这样一个疑问,if(MVC三层模式==三层架构思想)out.println("请继续观看--") 1.MVC(Model-View-Controller)设计模式: 首先让我们了解下MVC(Model-View-Controller)的概念: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controlle

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

这章主要讲整合开发,直接从实战讲起,对与ssh的单方面了解,请继续等待我的兴许文章. 解说不到位的地方欢迎大家指正:联系方式rlovep.com 具体请看源码凝视: 全部代码下载(csdn):链接 Github链接:链接https://github.com/wpeace1212/javaBlog/tree/master/sshDemo 写文章不易,欢迎大家採我的文章,以及给出实用的评论.当然大家也能够关注一下我的github.多谢. 1.整合流程 针对一个简单项目.让大家对三层机构和MVC有一个

SSH整合开发的web.xml配置

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.su

Hibernate+Spring+Struts2整合开发中的一个分页显示方案(转载)

分页显示一直是web开发中一大烦琐的难题,传统的网页设计只在一个JSP或者ASP页面中书写所有关于数据库操作的代码,那样做分页可能简单一点,但当把网站分层开发后,分页就比较困难了,下面是我做Spring+Hibernate+Struts2项目时设计的分页代码,与大家分享交流. 1.DAO层接口的设计,在MemberDao接口中定义了如下两个方法: public interface MemberDao{        //省略了其他的代码        /**     * 分页查询     * @

SSH整合开发过程

SSH整合开发过程 一.SSH整合开发概述 1.用到的三大框架 Struts2——负责控制业务逻辑层与表现层的交互,调用业务逻辑层,并将业务数据返回给表现层作组织表现,主要负责MVC的C层. Spring——将Web层.Service层.DAO层及PO无缝整合,其数据服务层用来存放数据. Hibernate——持久化对象pojo,采用Hibernate作为ORM框架,主要负责MVC的M层. 2.SSH整合的项目类型 一般是web project. 二.SSH整合步骤 1.搭建环境 导入SSH的j

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

在用ssh整合时,一开始用的是getCurrentSession(),获取当前线程上的session,但是总是抛异常,不能获取. 后来用sessionfactory的openSession(),但是,会发现一旦程序多次运行就会报错,提示没得session可获取. 那么怎么解决呢. 在beans.xml里面的hibernateProperties配置hibernate.current_session_context_class=org.springframework.orm.hibernate3.

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

GitHub虽好,但毕竟在国内访问不是很稳定,速度也不快,而且推送到上面的源码等资料必须公开,除非你给他交了保护费:所以有条件的话,建议大家搭建自己的Git Server.本地和局域网服务器都好,不信你试试,那速度,怎一个爽字了得! 默认情况下,使用TortoiseGit同步代码,每次都需要输入用户名和密码,但为了方便可以在客户端创建ssh密钥,用于服务器端和客户端的认证(详细过程大家可参考这里),但有时会出现“ 已经在Git Server服务器上导入了SSH公钥,可用TortoiseGit同步

访问域名时直接访问默认的工程,执行默认的方法—备忘录《二》

众所周知,访问域名或者某个IP时,如果不配置默认工程,是只显示tomcat界面.下面讲解直接访问域名或IP时,如何访问到默认工程 1.开发环境:springMVC+tomcat 2.下面正式开始配置,主要分为以下几个步骤 1)配置tomcat默认工程,配置tomcat/conf/server.xml文件(记得把默认端口号改成80,linux中可能会设置失败,可执行命令:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to