读书人

struts+Spring+hibernate实践小结

发布时间: 2012-11-07 09:56:10 作者: rapoo

struts+Spring+hibernate实践总结

? ?最近在学struts+spring+hibernate,想做个教务支持系统,先去网上查了查资料,做了个最简单的登陆操作,熟悉下整体结构和环境配置,期间还是遇到了不少挫折的。经过2天的奋战,终于把这个简单的登陆操作给实现了。主要的实施步骤可见上上篇帖子《struts+spring+hibernate实践》,也是从网上找来的。针对实践中遇到的问题做如下总结:

1.?????? 在myelipse6.5环境下(其他版本的myeclipse没试过),改动java文件和配置文件,如:web.xml, strut-config.xml,applicationContext.xml,是需要重新deploy一下才能起作用的。

2.?????? 导入spring库的时候,最好把同一个版本的库都导进来,为方便后面使用,比如对plugIn的添加:org.springframework.web.struts.ContextLoaderPlugIn。

3.?????? 使用struts1.2+spring1.2+hibernate3.1搭配比较好,其他的版本搭配的时候会出问题,就是在使用database reverse 工程生成POJO和hbm文件的时候,会在applicationContext.xml中的sessionFactory bean里面添加一个mappingResource,就是这个hbm文件,格式如下:

?? <bean id="sessionFactory"

?????? class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

?????? <property name="dataSource">

?????????? <ref bean="dataSource" />

?????? </property>

?????? <property name="hibernateProperties">

?????????? <props>

????????????? <prop key="hibernate.dialect">

????????????????? org.hibernate.dialect.MySQLDialect

????????????? </prop>

?????????? </props>

?????? </property>

?????? <property name="mappingResources">

?????????? <list>

????????????? <value>com/tss/beans/User.hbm.xml</value></list>

?????? </property></bean>

?红色部分就是添加POJO和hbm文件后自动加到这个bean里面的,这句会导致servlet action不可用。使用struts1.2+spring1.2+hibernate3.1就不会出现这个问题。

4.?????? singleton属性只有在spring1.2中的bean里面才有,在spring2.0中,bean没有“singleton”这个属性,而是在“scope”中对它进行设定。“scope”可以设定为“singleton”和“prototype”默认情况下是“singleton”即和原先的“singleton=true”性质一样,如果要实现单例模式则将“scope”设定为“prototype”,即和原先版本的“singleton=false”一样。

5.?????? 在一个bean里面,property是指这个bean对应的类里面定义的一个对象,你得在这个bean对应的那个类里面定义setter这个对象的方法,比如你在loginAction这个类里面定义了userDAO,那么你就要有setUserDAO()方法;userDAO的类型在ref种定义,格式如下:

<bean name="/login" class="com.seta.struts.action.LoginAction" singleton="false">

?????? <property name="userDAO">

?? ??????? <ref bean="userDAO" />

? ????? </property>??

??? </bean>

Ref 后可以有bean=或者local=,区别在于bean=是在这个contextapplication中搜索,local只是在本文件中搜索这个bean的定义,后者效率较高。 你也可以通过中间代理来管理对数据库的增删改查的操作, 如下:

<bean name="/login" class="com.seta.struts.action.LoginAction" singleton="false">

?????? <property name="userDAO">

?? ??????? <ref bean="userDAOProxy" />

? ????? </property>??

??? </bean>

这个proxy的定义如下:

<bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

? ? <property name="transactionManager">

?? <ref bean="transactionManager" />

? ? </property>

? ? <property name="target">

? ?<ref local="userDAO" /><!—这里调用我们自己实现的userDAO bean,对应的class是它的实现类à

? ? </property>

? ? <property name="transactionAttributes">

? ? ?<props>

??? <prop key="insert*">PROPAGATION_REQUIRED</prop>

??? <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>

??? <prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>

? ? ?</props>

? ? </property>

??? </bean>

6.???


</property>

<property name="target">

<ref local="userDAO" /><!—这里调用我们自己实现的userDAO bean,对应的class是它的实现类à

</property>

<property name="transactionAttributes">

<props>

<prop key="insert*">PROPAGATION_REQUIRED</prop>

<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>

<prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>

</props>

</property>

</bean> 6 楼 seya 2008-12-16 luopw123 写道
如果要实现单例模式则将“scope”设定为“prototype” 你这句写错了把 prototype 是按原型的 应该每次都产生不同的实例才对~!

笔误,多谢斧正。 7 楼 suan2046 2008-12-22 关于楼主的实践项目,我想知道楼主是如何管理 hibernate 中的session和事务的?

是交给spring 自动处理? 8 楼 seya 2009-01-13 suan2046 写道
关于楼主的实践项目,我想知道楼主是如何管理 hibernate 中的session和事务的? 是交给spring 自动处理?

对,交给Spring来管理。

读书人网 >软件架构设计

热点推荐