struts1和spring有两种整合的方法  一种是action和spring bean映射;一种是将action交给spring初始化

第一种方式:访问.do的URL->tomcat接收到request-〉到Struts配置文件里找对应的action-〉找到对应的action组件(Action那个类)-〉这个类对request进行一系列处理-〉调用spring提供的某个service的注入实例的方法->由这个方法返回值-〉响应输出

第二种方式:访问.do的URL->tomcat接收到request-〉到Struts配置文件里找对应的action-〉找不到对应的action组件(Action那个类)-〉去spring配置文件里找这个Action的映射,找到类-〉这个类对request进行一系列处理-〉调用spring提供的某个service的注入实例的方法->由这个方法返回值-〉响应输出

(Struts1很久不用了,也许有差漏)

hibernate和spring的整合比较复杂,建议找人当面讲

粗谈Struts——从执行顺序来看Struts

1.在web.xml中的配置
     
Struts在web.xml中的配置通常是自动生成的,这里不用赘述。只有一点应该说一下,那就是为ActionServlet这个servlet配置<load-on-startup>,而且应该让它的数值小一些,这样能让这个ActionServlet这个系统核心控制器早一点启动。

2.用户的请求

用户提交表单时,表单的action属性通常应以.do结束。当然,如果不写的话,系统也会默认(添加)以.do结束。以.do结束的原因是因为,在web.xml中我们通常都是配置拦截以.do结束的请求。
   3.定位Action
     
ActionServlet拦截到用户的请求后,并不自己处理,它委托给RequestProcessor进行处理。RequestProcessor使用请求URI与struts-config.xml文件中的Action的path属性进行对比,从而确定由哪个Action来处理这个请求。
   4.填充ActionForm

确定下来由哪个Action来处理请求后,系统会去检查Action的name属性。然后,根据name属性的值再在这个文件中去找对应的ActionForm来接受有户提交的表单的内容。在ActionForm中通常有一个方法ActionErrors validate(ActionMapping
mapping,HttpServletRequest request)需要重写,该方法是用来检验用户的输入是否合法的。不过,现在Struts已经不在提倡这种验证方法了。
   5.对表单的验证

借助于jakarta-oro.jar和commons-validator.jar的支持,Struts的校验功能非常的强大。此种的验证牵涉的内容很多,在此不做细说。如果,校验出错误,则将错误送到Action的input属性指定的页面去处理。
   6.Action处理

若校验通过,则Action做一些业务逻辑上的处理,其实Action就是业务逻辑处理器。处理之后,把处理的结果放到request(或Session等)里,然后转发到全局转发所指定的jsp页面或在Action的配置时配置的局部转发所指定的jsp页面里。
   7.结果的显示

在jsp页面中对Action处理的结果进行输出显示。

粗谈Spring——从执行顺序来看说Spring

1.Spring的加载(实例化)

如果不与Struts整合的话,Spring的加载是在Web程序的web.xml中配置的,在web.xml
中有两种选择,一种是ContextLoaderListener,另一种是ContextLoaderServlet。

如果与Struts进行整合,则Spring的加载是在struts-config.xml中配置的。
   2.容器后处理器
      在容器实例化之后可以对Spring容器进行一些操作,这个通过实现接口BeanFactoryPostProcessor接口来实现,该接口有一个方法void
postProcessorBeanFactory(ConfigurableListableBeanFactory
beanFactory)。这个接口有两个很有用的实现类,是Spring已经实现好的,它们是PropertyPlaceholderConfigurer(属性占位符配置器)和PropertyOverrideConfigurer(另一种属性占位符配置器)。
   3.与Spring容器的交互

对容器的处理操作结束以后,我们就能和Spring容器进行交互了,我们可以实现FactoryBean,FactoryBeanAware接口等方法获取BeanFactory实例,然后用之。
   4.配置bean和依赖关系

这包括配置依赖,注入属性值,注入field值,注入方法返回值,bean的继承。这些配置的过程中还包括配置强制初始化bean(depends-on),自动装配(autowire),依赖检查(dependency-check),这三项都是bean的属性(不是子元素)。
   5.对容器中的bean实例化的管理——bean后处理器
     
bean后处理器必须实现BeanPostProcessor接口,该接口中有两个方法,一个是Object postProcessBeforeInitialization(Object
bean,String name) throws BeansException
和 Object postProcessAfterInitialization(Object
bean,String name) throws BeansException,前一个方法是在实例化之前对该bean进行处理,后一个方法是在实例化之后对该bean进行处理。
   6.对bean生命周期的管理

对bean生命周期的管理有两个时机:一,在注入依赖关系之后;二,在即将销毁bean之前。

在注入依赖关系之后管理有两种方式:一,使用init-method属性;二,InitialingBean接口,它只有一个void afterPropertiesSet() throws
Exception方法。
      在bean销毁之前管理时也有两种方式:一,使用destroy-method属性;二,DisposableBean接口,它只有一个void destroy() throws Exception方法。
   这里要说明的是,如果同时配了属性,也实现了方法。则先执行接口的方法,再执行配置的属性指定的方法。
   如果既用了bean后处理器,有对bean的生命周期进行管理,则执行的顺序是:Object postProcessBeforeInitialization(Object
bean,String name) throws BeansException,void afterPropertiesSet() throws
Exception,init-method,Object postProcessAfterInitialization(Object
bean,String name) throws BeansException。
   7.创建bean实例

创建bean实例有三种方法:
      1.调用构造器创建一个bean实例。
    
2.BeanFactory调用某个类的静态工厂方法创建bean。
    
3.BeanFactory调用实例工厂方法创建bean。
   8.依赖注入

注入的顺序是先实例化本bean(它需要容器向它注入其它的bean),在实例化用来向本bean注入的bean,然后执行注入。当然,这种顺序是可以改变的,可以用强制实例化bean来改变这种顺序。强制实例化bean在前面已经说过。

注入的方式有两种,一种是设值注入,另一种是构造注入。

粗谈Hibernate——从执行顺序来看Hibernate

1.实例化Configuration对象

Hibernate在WEB-INF下查找hibernate.cfg.xml配置文件,根据hibernate.cfg.xml配置文件中配置的信息实例化Configuration对象

。如果使用了事件系统的话,在实例化Configuration对象后还应对事件监听器进行注册。这里值得一提的是配置的问题。一般为每个持久化类配置一个映射文件,其中包括基本映射和关系映射。在hibernate.cfg.xml中,使用<session-factory
/>元素下的<mapping resource="Xxxx.hbm.xml"
/>子元素来罗列所有的持久化类的映射文件,使Configuration在实例化时加载这些持久化类的配置信息。

2.实例化SessionFactory对象

通常Configuration的对象先调用configure()方法,以次来或得一个返回值,该返回值调用buildSessionFactory()方法来实例化SessionFactory对象。

3.实例化Session对象

有了SessionFactory对象后,它可以调用方法openSession()或openSession(Interceptor it)来实例化一个Session对象。如果没有使用拦截器就使用openSession()方法,使用了拦截器的话则使用openSession(Interceptor it)。这里的拦截器是一种事件框架,它实现了Interceptor接口的类,通过Interceptor接口,可以在数据进入数据库之前,对数据进行最后的检查,如果数据不符合要求,则可以修改数据,从而避免非法数据进入数据库。其实,通过Configuration还可以启用全局拦截器。1中所说的事件系统是功能更强大的事件框架,该事件系统可以替代拦截器,也可以作为拦截器的补充来用,详细内容请参看“[读书总结]Hibernate的事件框架
”那篇文章。

4.开始事务

在对数据库访问之前应该设置事务的开始点,告诉系统从哪儿开始对数据库进行操作,以便于让系统成功提交事务时的作用范围。

5.访问数据库

对数据库的操作无外乎对数据库中的数据进行增,删,改,查等操作。Hibernate的查询体系是非常强大的,它包括HQL查询,条件查询以及SQL查询等。

这里对Hibernate的查询不作细说,仅谈谈Hibernate的数据过滤。数据过滤不是一种常规的数据查询方法,而是一种整体的筛选方法。通过过滤数据也可以对数据进行筛选。过滤器与定义在类和集合上映射文件中的“where”约束子句非常相似,区别是过滤器可以带参数,应用程序可以在运行时决定是否启用给定的过滤器,以及使用什么样的参数值。而映射文件的“where”属性将一直生效,且无法动态传入参数。过滤器的用法与视图很相似,区别是试图在数据库中已经完成定义,而过滤器则还需要在应用程序中确定参数值。Hibernate过滤器起作用的时机要比一般的查询语句早。也就是说,在使用过滤器的情况下,进行数据查询时,过滤器先起作用,过滤下一些数据后再让查询语句去查。

6.提交事务

提交事务时可能成功,也可能失败。若提交失败则进行回滚,回滚时取消在事务开始以来的所有操作,这就体现了事务的原子性。

7.关闭Session

最后,关闭刚才实例化的Session对象。

Struts+Spring+Hibernate的Web应用执行过程的更多相关文章

  1. 使用struts+spring+hibernate组装web应用

    这篇文章将讨论怎样组合几个着名的框架去做到松耦合的目的,怎样建立你的构架,怎样让你的各个应用层保持一致.富于挑战的是:组合这些框架使得每一层都以一种松耦合的方式彼此沟通,而与底层的技术无关.这篇文章将 ...

  2. Struts+Spring+Hibernate项目的启动线程

    在Java Web项目中,经常要在项目开始运行时启动一个线程,每隔一定的时间就运行一定的代码,比如扫描数据库的变化等等.要实现这个功能,可以现在web.xml文件中定义一个Listener,然后在这个 ...

  3. Struts,spring,hibernate三大框架的面试

    Struts,spring,hibernate三大框架的面试 1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3 ...

  4. Struts+Spring+Hibernate进阶开端(一)

    入行就听说SSH,起初还以为是一个东西,具体内容就更加不详细了,总觉得高端大气上档次,经过学习之后才发现,不仅仅是高大上,更是低调奢华有内涵,经过一段时间的研究和学习SSH框架的基本原理与思想,总算接 ...

  5. Struts+Spring+Hibernate、MVC、HTML、JSP

    javaWeb应用 JavaWeb使用的技术,比如SSH(Struts.Spring.Hibernate).MVC.HTML.JSP等等技术,利用这些技术开发的Web应用在政府项目中非常受欢迎. 先说 ...

  6. 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)

    [SSH进阶之路]Struts + Spring + Hibernate 进阶开端(一) 标签: hibernatespringstrutsssh开源框架 2014-08-29 07:56 9229人 ...

  7. spring+hibernate 配置多个数据源过程 以及 spring中数据源的配置方式

    spring+hibernate 配置多个数据源过程 以及 spring中数据源的配置方式[部分内容转载] 2018年03月27日 18:58:41 守望dfdfdf 阅读数:62更多 个人分类: 工 ...

  8. Struts + Spring + Hibernate 进阶开端(一)

    Long Long ago,就听说过SSH,起初还以为是一个东东,具体内容更是不详,总觉得高端大气上档次,经过学习之后才发现,不仅仅是高大上,更是低调奢华有内涵,经过一段时间的研究和学习SSH框架的基 ...

  9. 用eclipse搭建SSH(struts+spring+hibernate)框架

    声明: 本文是个人对ssh框架的学习.理解而编辑出来的,可能有不足之处,请大家谅解,但希望能帮助到大家,一起探讨,一起学习! Struts + Spring + Hibernate三者各自的特点都是什 ...

随机推荐

  1. 修改IP的方法(C#)

    1. wmi 代码以后补 需要获取全部IP后,统一添加(貌似会造成网络瞬断) 2. iphlpapi.lib 代码以后补 可以直接添加和删除IP 3. netsh 可以直接添加和删除IP

  2. Storm官方文档翻译之设置开发环境

    本文将介绍如何设置Storm的开发环境.下面是大纲: 1.下载Storm发布包,解压,将解压的 bin目录放到你电脑的PATH中. 2.为了能够在远程集群中启动或者停止Topology,请将集群信息放 ...

  3. how to increase an regular array length in java?

    Arrays in Java are of fixed size that is specified when they are declared. To increase the size of t ...

  4. 天津工业大学CST专业培养方案

    第二学期 网页设计基础 计算机前沿技术 大学生心理健康与人生发展 高级语言程序设计II 思想道德修养与法律基础 职业生涯规划 大学英语二级(A) 大学物理(理三1) 线性代数 高等数学(理一2) 体育 ...

  5. 去掉input text后面的叉

    如题 input[type=text]::-ms-clear{ display: none; } input::-webkit-search-cancel-button{ display: none; ...

  6. 《Head.First设计模式》的学习笔记(9)--外观模式

    意图:为子系统中的一组接口提供一个一致的界面,Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 结构: 例子: 假设你有一套杀手级的家庭影院系统,内含DVD播放器.投影仪.自 ...

  7. .htaccess重写URL讲解

    使用ThinkPHP和Laravel等框架的都知道,所以的请求都需要经过index.php文件入口,无论你的URI是什么. 当然除了访问的是静态文件或者访问路径的文件真实存在,例如你访问xxx.com ...

  8. 在调试安卓系统的时候需要这个 ”adb disable-verity“

    在调试设备的时候.想要对文件进行读写 于是使用adb remount 出现提示. 请使用 ”adb  disable-verity“ 于是使用adb  disable-verity 的命令. 得到如下 ...

  9. zTree异步加载并初始化树时全部展开(贴主要代码)

    <%@page pageEncoding="UTF-8"%> <%@include file="/commons/include/html_doctyp ...

  10. iOS 判断奇偶数

    if (_bigUrlArray.count%2==0) {//如果是偶数 a = i*(_bigUrlArray.count/count);//每个线程图片初始数 b = (i+1)*(_bigUr ...