Spring的内容较多,原计划两天完成的任务被迫延迟一天,希望大家见谅,今天学习的内容是Spring,Struts和Hibernate框架的整合。
1. getCurrentSession()与openSession()的区别:
1) 采用getCurrentSession()创建的session会绑定到当前线程中,而openSession()创建的session则不会
2) 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()创建的session必须手动关闭
2. 使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
1) 如果使用的是本地事务(jdbc事务)
<property name="hibernate.current_session_context_class">thread</property>
2) 如果使用的是全局事务(jta事务)
<property name="hibernate.current_session_context_class">jta</property>
3. Spring与Hibernate集成(声明式服务):
1) 事务的传播特性:
①. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启
②. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行
③. PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
④. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
⑤. PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。
⑥. PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常
⑦. PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行
2)声明式事务配置
①. 配置SessionFactory
②. 配置事务管理器
③. 事务的传播特性
④. 哪些类哪些方法使用事务
2) 编写业务逻辑方法
①. 继承HibernateDaoSupport类,使用HibernateTemplate来持久化,HibernateTemplate是 Hibernate Session的轻量级封装
②. 默认情况下运行期异常才会回滚(包括继承了RuntimeException子类),普通异常是不会滚的
③. 编写业务逻辑方法时,最好将异常一直向上抛出,在表示层(struts)处理
④. 关于事务边界的设置,通常设置到业务层,不要添加到Dao上
4. Spring与Struts的集成
1) 原理:在Action中取得BeanFactory对象,然后通过BeanFactory获取业务逻辑对象
2) 具体操作步骤:
方案一:
①. spring和struts依赖库配置
②. 在struts的Action中调用如下代码取得BeanFactory
BeanFactory factory=WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());
③. 通过BeanFactory取得业务对象,调用业务逻辑方法
方案二:
①. spring和struts依赖库配置
②. 因为Action需要调用业务逻辑方法,所以需要在Action中提供setter方法,让spring将业务逻辑对象注入过来
③. 在struts-config.xml文件中配置Action:<action>标签中的type属性需要修改为org.springframework.web.struts.DelegatingActionProxy,DelegatingActionProxy是一个Action,主要作用是取得BeanFactory,然后根据<action>中的path属性值到IoC容器中取得本次请求对应的Action
④. 在spring配置文件中需要定义struts的Action,如:
<bean name="/login" class="cn.itcast.usermgr.actions.LoginAction" scope="prototype">
<property name="userManager" ref="userManager"/>
</bean>
* 必须使用name属性,name属性值必须和struts-config.xml文件中<action>标签的path属性值一致
* 必须注入业务逻辑对象
* 建议将scope设置为prototype,这样就避免了struts Action的线程安全问题