SSH是如何粘合在一起的

structs,spring和Hibernate到底是如何协同工作的呢?看了一天书,有所感悟,小结如下:

如何原本归属Struts管理的控制流的控制权交给Spring,以便使用Spring的特性?(实际上就是一个支持SSH的web项目如何在myeclipse中开始)经验如下:
首先,创建一个web project,加入struts和spring支持
第二,修改struts-config.xml配置文件,
1、将每个action中的type由
type="com.dsr.ssh.action.LoginAction"改为
type="org.springframework.web.Struts.DelegatingActionProxy"
这样设置后,提交到/login.do的请求,控制权将先交到spring手中,spring再决定是否转交给struts的action。
2、在最后(</struts-config>标签之前)加入一个<plug-in>元素,注意,必须是最后,否则会报错。<plug-in>内容如下:
    <!-- Spring plugin -->
  <plug-in className="org.springframework.web.struts.ContextLoaderPlugerIn">
  <set-property property="contextConfigLocation" value="src/spring-beans.xml" />
  </plug-in>
这样,就让struts使用spring代理Action行为了。
3、配置Spring-beans.xml:
在<beans>元素中加入代表着loginAction的bean元素,加入的行如下:
<bean name="/login" class="com.dsr.ssh.action.LoginAction"  scope="prototype"></bean>
scope="prototype" 会在该类型的对象被请求 时创建一个新的action对象。如果没有配置scope=prototype则添加的时候不会新建一个action,他仍然会保留上次访问的过记录的信息 webwork的Action不是线程安全的,要求在多线程环境下必须是一个线程对应一个独立的实例,不能使用singleton。所以,我们在Spring配置Webwork Action Bean时,需要加上属性scope=”prototype”或singleton=”false”。


Spring整合Hibernate是基于以下事实的:
1、hibernate通过sessionFactory的机制进行数据库管理,因此只要能够封装hibernate的session生成机制,就可以接管hibernate的管理,
可以从spring的配置文件看出,在增加hibernate支持时,必然会增加如下元素:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
</bean>
于是,session的管理(在代码中的实例化)就交给了spring,谁需要这个session(当然是DAO们了),谁就在spring的配置(applicationContext.xml)中将这个session元素配置为需要注入的依赖,举例如下:
<bean id="UserDAO" class="com.dsr.ssh.hibernate.UserDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
这样在生成UserDAO时,相应的session也就生成并注入了。(ref bean可以跨文档引用bean,还有ref local,可以引用本XML文件中出现的bean;ref parent可以引用spring配置父类里的bean)


注意:由于DAO类还依赖于HibernateTemplate类,由于各种原因(不知道为啥),在hibernate3之前还要配置HibernateTemplate对sessionFactory的依赖,例如:
<bean id="HibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
配置好之后,在代码里即可按照Spring的形式调用DAO类。


然而数据库操作还涉及Transanction,于是还需要解决让Spring管理事务的问题,解决办法有三种,
1、编程式事务管理:尽在Spring中配置HibernateTransactionManager元素,指明该元素依赖于Session,在代码中创建HibernateTemplate时指定该HibernateTransactionManager,并使用
配置如下:
<bean id="HibernateTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
2、声明式:在编程式的基础上,对DAO元素进行改造,使DAO元素在生成时即被注入一个HibernateTransactionManager,使用该方法时,由于事务性要求很普遍,可考虑继承的用法。
3、使用BeanNameAutoProxyCreator自动创建事务代理,这种方式最为灵活:首先在1、编程式的配置基础上,增加一个TransactionInterceptor bean(事务拦截bean)拦截指定DAO的所有事务操作;第二,增加一个BeanNameAutoProxyCreator元素,用来指定哪些DAO要使用上面所说的TransactionInterceptor bean。这两项实际上使用的就是Spring中大名鼎鼎的AOP,面向方向编程,http://www.jdon.com/AOPdesign/jdon-aop.htm里关于锁的描述,可以意会什么是面向方向。


这样,通过修改struts中Action父类为Spring提供的地址类,以及将heibernate的session交给Spring管理,SSH终于粘合在一起。: )
下一个需要解决的问题是,如何使用myeclipse中database explore透视图生成需要的DAO类,以及这些DAO类在配置完成后如何使用(标准的使用格式)问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值