SSH框架整合:
一、各框架知识点回顾
在没有其他框架时,单独的框架如何实现,以下伪代码:
持久层(Hibernate):
public class BookDao{ public void save(Book book){ Configuration cfg = new Configuration().configure(); SessionFactory sf = cfg.buildSessionFactory(); Session session = sf.openSession(); Transaction tx = session.beginTransaction(); session.save(book); tx.commit(); session.close(); } }
业务层(Spring):
public calss BookService{ private BookDao bookDao; public void setBookDao(BookDao bookDao){ this.bookDao = bookDao; } public void save(Book book){ bookDao.save(book); } }
<bean id="bookDao" class = "...BookDao"></bean> <bean id="bookService" class = "...BookService"> <property name = "bookDao" ref="bookDao"/> </bean>
WEB层(Struts2)
public class BookAction extends ActionSupport implements ModelDriven<Book>{ private Book book = new Book(); public Book getModel(){ return book; } public String save(){ WebApplicationContext wap = WebApplicationContextUtils.getWebApplicationContext(...); BookService bs = wap.getBean("bookService"); bs.save(book); } }
二、搭建SSH框架开发环境
1、创建WEB项目,引入相应jar包(Struts2、Spring、Hibernate框架开发相关)
struts2-convetion-plugin-2.3.15.3.jar---struts2的注解开发的jar包
struts2-spring-plugin-2.3.15.3.jar---struts2用于整合Spring的jar包
hibernate-distribution-3.6.10.Final\hiernate3.jar
hibernate-distribution-3.6.10.Final\lib\required\*.jar
hibernate-distribution-3.6.10.Final\lib\jpa\*.jar
slf4j-log4j12-1.7.2.jar---整合日志记录
com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar---连接池数据库驱动包
spring-tx-3.2.0.RELEASE.jar---事务管理
spring-web-3.2.0.RELEASE.jar--整合WEB项目
spring-jdbc-3.2.0.RELEASE.jar--事务管理
spring-orm-3.2.0.RELEASE.jar--整合Hibernate
spring-test-3.2.0.RELEASE.jar--整合Junit单元测试
IOC需要的jar包:
spring-beans-3.2.0.RELEASE.jar
spring-context-3.2.0.RELEASE.jar
spring-core-3.2.0.RELEASE.jar
spring-expression-3.2.0.RELEASE.jar
com.springsource.org.apache.log4j-1.2.15.jar---日志记录的jar包
com.springsource.org.apache.commons.logging-1.1.1.jar---日志整合的jar包
AOP需要的jar包:
spring-aop-3.2.0.RELEASE.jar
spring-aspects-3.2.0.RELEASE.jar
com.springsources.org.aopalliance-1.0.0.jar
com.springsources.org.aspectj.weaver-1.6.8.RELEASE.jar
2、引入相应的配置文件
Struts2框架的配置文件:
web.xml---配置核心过滤器(StrutsPrepareAndExecuteFilter类)
struts.xml---Struts2框架本身的配置文件(在SSH整合中使用纯注解方式时,此文件可省略)
Hibernate框架的配置文件:
hibernate.cfg.xml---核心配置文件(在SSH整合中可省略此文件)
映射文件
Spring框架的配置文件:
web.xml---配置核心监听器(ContextLoaderListener类)
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
applicationContext.xml---Spring的核心配置文件
log4j.properties---日志配置文件
3、创建包结构(action、service、dao、domain)
(一)Struts2整合Spring框架
4、创建页面(WebRoot下新建jsp页面)
部署项目到Tomcat访问本地jsp页面
5、编写Action、Service和Dao
Service层注入Dao
Action中通过整合jar包自动注入,提供Service的set()方法即可
6、配置Action、Service和Dao的类
Service和Dao交给Spring管理,在applicationContext.xml中配置
Struts2和Spring整合的两种方式:
(1)Action的类由Struts2自身去创建;---在struts.xml中配置
(2)Action的类交给Spring框架创建(可以交给Spring的AOP去管理)---配置时手动注入Service(Action创建类是多例,Spring创建类默认是单例模式,所以交由Spring创建时需要设置scope = "prototype")
(二)Spring整合Hibernate框架
7、创建数据库
8、创建映射文件---类和表的对应关系(Hibernate会根据此文件在数据库中创建表结构)
9、Spring整合Hibernate
jdbc.properties属性文件
在applicationContext.xml中配置连接池(ComboPooledDataSource类),引入外部属性文件
在applicationContext.xml中配置Hibernate的相关属性SessionFactory,注入连接池,加载映射文件
10、编写DAO中的代码 extends HibernateSaoSupport 注入SessionFactory
配置DAO时
<bean id = "productDao" class="...ProductDao"> <property name="sessionFactory" ref = "sessionFactory"/> </bean>
在DAO中调用模板完成保存操作
this.getHibernateTemplate().save(product);
11、事务管理
在applicationContext.xml中配置事务管理器(HibernateTransactionManager类),注入sessionFactory,开启注解事务使用<tx:annotation-driven/>标签,引入HibernateTransactionManager的ID,在业务层的类上添加@Transaction注解
三、综合案例
SSH框架
配置事务管理器
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> 开启注解事务 <tx:annotation-driven transaction-manager="transactionManager" />
编写DAO中的代码
配置Hibernate的相关属性
Action的类由struts2自身创建
Service和DAO是如何配置的
直接在applicationContext.xml中进行配置
Action的类由Struts2自身去创建
Struts2和spring整合的2种方式
Action的类由Struts2自身去创建
Action的类交给Spring框架创建
商品管理的Action类
模型驱动使用的类
Struts和Spring整合过程中按名称自动注入的业务层类
spring的框架的核心监听器
struts.xml中需要配置那些内容
在src目录下引入struts.xml
Struts2的框架的核心过滤器的配置
spring配置文件
hibernate框架配置文件
struts2框架的配置文件
jar包整合2
jar包整合
未整合前的代码编写
action调用service中的方法,service调用dao中的方法
不使用Struts配置文件在Spring中Action配置需要改为多利即<bean>标签后添加scope属性"prototype"
SSH框架整合
Spring整合Hibernate——添加事务管理
步骤十一:事务管理
【a】Spring中配置事务管理器
【b】开启注解事务
【c】事务管理的类上添加注解(业务层上)
Spring整合Hibernate——编写DAO的代码(此时已经去掉Hibernate的核心配置文件)
步骤十:编写DAO中的代码(完成保存的操作)
原理:没整合前需要在dao的方法里去获得一系列对象以及session对象,但整合之后只需要使用Hibernate的模板即可完成相应操作。正常情况下需要在DAO里进行注入,但是Spring已经提供了一个HibernateSupport类,只需DAO类继承它即可(这个类中已经将HibernateTemplate模板注入,通过getHibernateTemplate()即可获得,还有一个好处,这个类提供了一个setSessionFactory(SessionFactory sessionFactory)方法,当在DAO中直接注入SessionFactory属性时(注意property的name要为sessionFactory,DAO继承了这个类的SessionFactory和set方法),该方法会判断当模板为空时会自动创建模板,所以就不用考虑模板对象了)。
【a】DAO继承HibernateDaoSupport
【b】spring配置文件中给DAO注入SessionFactory属性,属性名为sessionFactory
【c】通过this.getHibernateTemplate().save(对象)记性保存操作
Spring整合Hibernate——配置去掉Hibernate的配置文件(添加properties文件)
有Hibernate的配置文件时需要配置的属性
步骤1:编写properties文件
步骤2:spring配置文件中通过
<context:property-placeholder location="classpath:jdbc.properties"/>引入properties文件
步骤3:配置连接池(配置c3p0连接池)
步骤4:配置Hibernate相关属性(例如:生成表成略、获取session标签配置、mapping配置)(hibernate-release-5.0.7.Final\project\etc\hibernate.properties可以找到MySQL方言)
Spring整合Hibernate——创建数据库和映射文件
步骤七
1、创建数据库
2、创建映射文件(约束在Hibernate核心包下org.hibernate.hibernate-mapping.dtd)
Action类交给Spring创建(建议使用这种方式创建Action,因为可以使用Spring的AOP进行管理)(action创建的实例是多例模式,所以Action类bean标签要使用scope=“prototype”属性,其次action标签的class属性不再写类的全路径,而是Action<bean>标签的id)
步骤六:配置Action、Service、Dao的类——Struts2整合Spring
重点注意:Struts-Spring-plugin.jar:在不使用ApplicationContext情况下对Action里的productService进行赋值,要保证set方法后的名称和<bean>标签里的id名相同才会按名称自动注入。
【a】Service和Dao可以交给Spring进行管理(配置bean标签)。
copy Qualified Name:复制类的全路径。
<bean id="productService" class="com.imooc.service.ProductService">
<property name="productDao" ref="productDao"></property>
</bean>
<bean id="productDao" class="com.imooc.dao.ProductDao"></bean>
</beans>
【b】Struts2和Spring整合的两种方式:(针对Action对象的创建方式)。
1、Action的类由Struts2去创建。
<package name="ssh" namespace="/" extends="struts-default">
<action name="product_*" class="com.imooc.action.ProductAction" method="{1}">
</action>
</package>
2、Action的类由 Spring去创建。
引入相应配置文件
1、Struts2配置文件
web.xml(配置struts核心过滤器)
struts.xml(如果使用纯注解开发,也可以省略)
2、Hibernate配置文件
hibernate.cfg.xml(在SSH整合中该配置文件可以省略)
映射文件
3、Spring框架的配置文件
web.xml(配置核心监听器,作用是启动服务器时候,加载Spring核心配置文件,该监听器中还有一个参数(全局初始化参数),如果不配置这个,默认加载WEB-INF下的ApplicationContext.XML,配置了就会加载classes下的ApplicationContext.xml)
applicationContext.xml
SSH知识点回顾
WEB层(V):Struts2
业务层(C):Spring
持久层(M):Hibernate
整合之后就不用写这么多繁琐的代码。
Hibernate使用ServiceRegistryBuilder出错
原因:版本4之后的Hibernate中buildServiceReguistry()方法被替换了。
解决方法:(1)版本导入更换为:
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
(2)在版本4中的用法:
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
(3)在版本5中的用法:
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
2018-03-27