Struts+Spring+Hibernate的Web应用执行过程
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的整合比较复杂,建议找人当面讲
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处理的结果进行输出显示。
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在前面已经说过。
注入的方式有两种,一种是设值注入,另一种是构造注入。
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应用执行过程的更多相关文章
- 使用struts+spring+hibernate组装web应用
这篇文章将讨论怎样组合几个着名的框架去做到松耦合的目的,怎样建立你的构架,怎样让你的各个应用层保持一致.富于挑战的是:组合这些框架使得每一层都以一种松耦合的方式彼此沟通,而与底层的技术无关.这篇文章将 ...
- Struts+Spring+Hibernate项目的启动线程
在Java Web项目中,经常要在项目开始运行时启动一个线程,每隔一定的时间就运行一定的代码,比如扫描数据库的变化等等.要实现这个功能,可以现在web.xml文件中定义一个Listener,然后在这个 ...
- Struts,spring,hibernate三大框架的面试
Struts,spring,hibernate三大框架的面试 1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3 ...
- Struts+Spring+Hibernate进阶开端(一)
入行就听说SSH,起初还以为是一个东西,具体内容就更加不详细了,总觉得高端大气上档次,经过学习之后才发现,不仅仅是高大上,更是低调奢华有内涵,经过一段时间的研究和学习SSH框架的基本原理与思想,总算接 ...
- Struts+Spring+Hibernate、MVC、HTML、JSP
javaWeb应用 JavaWeb使用的技术,比如SSH(Struts.Spring.Hibernate).MVC.HTML.JSP等等技术,利用这些技术开发的Web应用在政府项目中非常受欢迎. 先说 ...
- 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)
[SSH进阶之路]Struts + Spring + Hibernate 进阶开端(一) 标签: hibernatespringstrutsssh开源框架 2014-08-29 07:56 9229人 ...
- spring+hibernate 配置多个数据源过程 以及 spring中数据源的配置方式
spring+hibernate 配置多个数据源过程 以及 spring中数据源的配置方式[部分内容转载] 2018年03月27日 18:58:41 守望dfdfdf 阅读数:62更多 个人分类: 工 ...
- Struts + Spring + Hibernate 进阶开端(一)
Long Long ago,就听说过SSH,起初还以为是一个东东,具体内容更是不详,总觉得高端大气上档次,经过学习之后才发现,不仅仅是高大上,更是低调奢华有内涵,经过一段时间的研究和学习SSH框架的基 ...
- 用eclipse搭建SSH(struts+spring+hibernate)框架
声明: 本文是个人对ssh框架的学习.理解而编辑出来的,可能有不足之处,请大家谅解,但希望能帮助到大家,一起探讨,一起学习! Struts + Spring + Hibernate三者各自的特点都是什 ...
随机推荐
- 常见的jquery一些效果
1.CSS渐变:background: linear-gradient(to bottom right, #999 , #eee);
- javaWEB总结(6):ServletRequest
1.首先看ServletRequest的API javax.servlet Interface ServletRequest All Known Subinterfaces: HttpServletR ...
- ShellExecute, WinExec, CreateProcess区别
ShellExecute ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件.打开一个目录.打印一个文件等等),并对外部程序有一定的控制. 有几个API函数都可以实现这些功能 ...
- 线程中sleep方法和wait方法有什么区别?
如果你没有接触过java的多线程,那么多对于这两个方法可能有点陌生,看名字好像这两个方法是差不多的,但是实际上面差别好大. 首先我们看一下官方的API Sleep(sleep有两个方法,另一个方法传递 ...
- 第四十二节,configparser特定格式的ini配置文件模块
configparser用于处理特定格式的文件,其本质上是利用open来操作文件. 特定格式的ini配置文件模块,用于处理ini配置文件,注意:这个ini配置文件,只是ini文件名称的文本文件,不是后 ...
- hdu_4824_Disk Schedule(dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4824 题意:中文,不解释 题解:双调欧几里德旅行商问题,具体可看dp双调欧几里德旅行商,这里注意的是起 ...
- 缓存1 静态缓存-->读库保存成php文件 mkdir-->file_put_contents-->var_export -->include
@mkdir()-->file_put_contents-->$data = "<?php\nreturn ".var_export($setting, tru ...
- LeetCode OJ 292.Nim Gam19. Remove Nth Node From End of List
Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...
- MyEclipse的Expressions没有结果的解决办法
之前我的Expressions在Value这一列什么都不显示,就连简单的1+2结果3都不显示出来. 然后我咬咬牙把它卸载了,然后重装就好了,我也不清楚是什么原因. 1.之前我安装的目录是"C ...
- PreferenceActivity详解
为了引入这个概率 首先从需求说起 即:现有某Activity专门用于手机属性设置 那么应该如何做呢? 根据已学知识 很快一个念头闪过 即:Activity + Preference 组合 前者用于界面 ...