167.SSH整合

一、明确三大框架在项目中的作用

       1. Struts2

              充当MVC的角色

       2. Hibernate

              Dao层使用Hibernate来实现

       3. Spring

              使用Spring实现声明式事务管理

              使用Spring的Ioc和DI实现完全的面向接口编程

二、三大框架整合步骤

         1. 新建一个工程,将工程编码和JSP编码都改成UTF-8

         2. 在WEB-INF/lib目录下导入三大框架的架包,推荐按类型分文件夹导入,如图

              167.SSH整合

        3. 建立三个Source Folder,因为已经有src了,再建两个[config和test],明确它们的作用,并设置相应的包。Source Folder的根目标下就是classpath。

              167.SSH整合

        4. 在Dao和Service层相应的包中写上接口和类[以Person为例]

                DAO中只有一个public void savePerson(Person person)方法。

        5. 将Spring配置文件进行分类管理,如图

       167.SSH整合

             将不同功能分开到子配置文件中,然后在applicationContext.xml文件中进行整合。如图

167.SSH整合

在applicationContext-db.xml文件中配置数据库连接池、sessionFactory、事务管理器、通知以及切面。如图

167.SSH整合

167.SSH整合

从上面可以看出,hibernate的相关配置基本都在sessionFactory里有所体现了,只剩下实体类的配置文件还放在hibernate.cfg.xml文件中,其实完全可以也放在spring中,上图注释部分的写法就是如何在Spring配置文件中写入实体类的配置文件,如果这么写的话hibernate.cfg.xml文件就完全没有用了。这是Spring4和Hibernate5整合的一个问题,hibernate.cfg.xml中的配置当使用配置文件的形式导入Spring配置文件中的时候,有些属性不起作用。所以只能这么写了。要不是为了体现Hibernate配置文件的存在,完全可以将它的加入Spring配置文件中了。

        6. 当sessionFactory配置好的时候,就可以直接先测试一下,在名为test的Source Folder下建立一个edu.njusttz.spring.test的包,并在该包下面创建SessionFactoryTest.java文件,具体测试代码如下:

167.SSH整合

        7. 由于之前Spring配置文件已经分类,所以现在可以在分类后的Spring配置文件applicationContext-person.xml中配置Dao和Service.

167.SSH整合

注意上图中dao注入sessionFactory的时候,sessionFactory不在同一个配置文件中,所以MyEclipse没有提示,这里只需要手动写上去即可,Spring能读取到。

        8. 在test的Source Folder下面新建PersonTest.java文件,对Dao进行测试。

167.SSH整合

具体Dao类的代码:PersonDao.java继承自IPersonDao这个接口。

167.SSH整合

到此,Hibernate和Spring的整合已经完成,下面就是要加入Struts2了。

        9. 在项目的web.xml文件中进行配置。

             1)以监听器的形式整合Spring

167.SSH整合

需要注意的是:

1.该监听器监听Web服务器【此处是Tomcat】的启动和关闭,当Web服务器启动的时候,Spring容器也跟着启动;当Web服务器关闭的时候Spring容器也跟着销毁。注意这个监听类ContextLoaderListener,该类中有两个方法:

167.SSH整合

167.SSH整合

这两个方法正好对应着Spring容器的启动和销毁。

2. ContextLoaderListener这个类继承自ContextLoader这个类,该类中有一个参数contextConfigLocation ,对应着配置文件中<param-name>的值。是固定的,不可以修改。但是在ContextLoader类中说明了Spring配置文件可以存放在很多位置,具体说明如图所示:默认不配置的话是在/WEB-INF/applicationContext.xml

167.SSH整合

3.当Spring启动的时候,Service和Dao层的由于是单例的,所以它们的对象也就产生了,而Action属于多例,所以它只有在调用的时候才会产生对象。

2)配置Struts2过滤器

       167.SSH整合

        10.在src下面的edu.njusttz.action包下面创建一个PersonAction.java文件,对Person进行相应操作。因为要调用Service层,所以它必须有Service接口的对象。

167.SSH整合

然后在Spring配置文件applicatonContext-person.xml文件中加入该Action,让Spring给Action创建对象。【特别注意:Action是多例

167.SSH整合

这里需要强调的是Spring为什么可以创建Action的对象?

之前学习Struts2的时候知道,Action对象是由Struts的对象工厂ObjectFactory调用bulidAction()方法产生,它怎么就交给Spring去创建了呢?这是因为struts架包里有个struts到spring的插件包167.SSH整合,在该包下面有个167.SSH整合文件:

167.SSH整合

它重写了Struts2的ObjectFactory类。这里就需要了解Struts2配置文件的加载顺序了。

它加载的基本顺序是struts-default.xml-->struts-plugin.xml-->struts.xml ,后面的覆盖前面的。

        11. 在config这个Source Folder的根目录下加入struts.xml。

特别注意,必须是在根目录下,而且文件名不能变,因为struts2读取的就是这个目录下的这个文件。

167.SSH整合

167.SSH整合

这里在struts.xml文件中引入了struts-person.xml达到项目模块化开发的目的。

struts-person.xml内容如下:

167.SSH整合

这里使用了动态匹配。注意这里的class=”personAction”为什么可以直接写personAction?

而不是写成class=”edu.njusttz.entity.PersonAction”?

首先,两种写法都可以,之所以可以这么写是因为这里的personAction是Spring容器中产生的那个Action类。

到此,SSH框架整合全部完成,下面只需要发布项目在浏览器进行测试即可。

http://localhost:8080/s2sh/person/personAction_savePerson.action