免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1564 | 回复: 0
打印 上一主题 下一主题

Spring+Hibernate+Struts2整合文档 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-05 14:22 |只看该作者 |倒序浏览
一、 Spring+Hibernate整合:
Spring整合Hibernate,是做了一个很大的调整的,因为spring可以把管理Hibernate的工作都做了,以前的hibernate.cfg.xml文件都去掉了,而将这些内容都交给了spring来管理了。
1、 applicationContext.xml文件中应该配置如下内容:
Xml代码
  • //配置数据连接类   
  • bean id="dataSource"   
  •         class="org.apache.commons.dbcp.BasicDataSource">   
  •         property name="driverClassName"   
  •             value="org.gjt.mm.mysql.Driver">   
  •         property>   
  •         property name="url" value="jdbc:mysql://localhost:3306/test">property>   
  •         property name="username" value="root">property>   
  • bean>   
  • //配置session工厂类   
  • 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>   
  •                 prop key="hibernate.show_sql">trueprop>   
  •             props>   
  •         property>   
  •         property name="mappingResources">   
  •          value>com/hejianjiao/vo/Person.hbm.xmlvalue>   
  •         property>   
  • bean>   //配置数据连接类
      
      
      
      
    //配置session工厂类
      
       
      
      
       
       
         org.hibernate.dialect.MySQLDialect
       
        true
       
      
      
       com/hejianjiao/vo/Person.hbm.xml
      
    2、可以使用spring中的HibernateDAOSupport与HibernateTemplate类来进行数据持久化操作:
    A、HibernateDAOSupport类中定义了对session、sessionFactory的操作方法与getHibernateTemplate方法来获得一个HibernateTemplate实例;
    B、HibernateTemplate类中定义了对数据持久化的各种封装的方法,我们可以用它来对数据进行操作。
    因此在使用时,我们可以继承HibernateDAOSupport类,然后实例化HibernateTemplate类来进行数据持久化。
    二、 Spring+Struts2整合:
    1、spring配置在web.xml文件中的上下文监听器:
    Xml代码
  • context-param>   
  •   param-name>contextConfigLocationparam-name>   
  •   param-value>/WEB-INF/applicationContext*.xmlparam-value>   
  • context-param>   
  •    
  • listener>   
  • listener-class>org.springframwork.web.content.ContextLoaderListenerlistener-class>   
  • listener>   
      contextConfigLocation
      /WEB-INF/applicationContext*.xml
    org.springframwork.web.content.ContextLoaderListener
    2、struts2配置在web.xml文件中的过滤器:
    Xml代码
  • filter>   
  • filter-name>struts2filter-name>   
  • filter-class>org.apache.struts2.dispatcher.FilterDispatcherfilter-class>   
  • filter>   
  •    
  • filter-mapping>   
  •   filter-name>struts2filter-name>   
  •   url-patter>/*url-patter>   
  • filter-mapping>   
    struts2
    org.apache.struts2.dispatcher.FilterDispatcher
      struts2
      /*
    3、设置struts.xml文件,就可以使用spring的IOC来管理struts的Action:
    Xml代码
  • constent name="struts.objectFactory" value="spring" />   
    4、第三步设置后,以后在struts.xml 文件中配置一个action时,它的class就不是一个类了,而是在applicationContext.xml文件中定义过的类的ID,在struts.xml文件中就只需要引用定义好的类的id 就可以了。
    然后特别要注意的一个问题:action是一个请求就是一个action对象,而在spring中则不是的,它是自动分配类的实例的,是使用的单态模式来生产类的实例的,不符合action,因此在applicationContext.xml文件中定义每个action时,都要在类后加上:
    Xml代码
  • scope="prototype" 属性   scope="prototype" 属性
    三、 三者组合开发:
    一般在组合开发时,没有什么难的,只要把上面两步做好就可以是三个组合开发了。

    [img][/img]
    上图则是对于进行组合开发时,一般使用的系统架构:
    1、 先从最底层开发,先开发POJO类,和Hibernate映射文件。它相当于系统的数据库层。
    2、 再开发DAO层,它是对于数据进行持久化的一层,专门处理各种数据增、删、改、查的功能。并且使用DAO工厂模式,以保证和上层没有任何的联系,并且可以方便于类与接口的扩展。
    3、 第三是开发manager层,它相当于软件的业务逻辑层,即专门处理各种业务逻辑。实现系统的业务处理功能。并且它隔离事务,使与下层的数据持久和上层的数据操作没有任何的联系。
    4、 Action层,也即软件的表示层,处理action的接收与回复。各action由spring管理。
    五、 组合开发中的一些问题:
    1、 在组合开发中,常见的一个问题就是session的管理,当我们使用HibernateTemplate操作数据库时,可以不对session进行显示的操作,spring可以自动处理session的打开与关闭。
    我们可以在web.xml文件中显示的配置一个session管理的过滤器,它专门帮助我们关闭session:
    Xml代码
  • filter>   
  •         filter-name>lazyLoadingFilterfilter-name>   
  • filter-class>   
  • org.springframwork.orm.hibernate3.support.OpenSessionInViewFilter   
  • filter-class>   
  • filter>   
  •    
  • filter-mapping>   
  •          filter-name>lazyLoadingFilterfilter-name>   
  •          url-pattern>*.actionurl-pattern>   
  • filter-mapping>   
  • 注:它一定要在struts2的过滤器之前。因为web.xml文件的过滤器执行是有顺序的。而session一定在前面进行。   
            lazyLoadingFilter
    org.springframwork.orm.hibernate3.support.OpenSessionInViewFilter
             lazyLoadingFilter
             *.action
    注:它一定要在struts2的过滤器之前。因为web.xml文件的过滤器执行是有顺序的。而session一定在前面进行。
    它会在所有的action处理完了,页面显示完了,就会自动关闭session。
    六、 spring事务处理
    1、事务的处理也交给了spring来管理,要在applicationContext.xml文件中上配置事务管理类:
    Xml代码
  • //实施事务管理的bean   
  • bean id=”transactionManager”   
  • class=”org.springframwork.orm.hibernate3.HibernateTransactionManager”>   
  •        property name=”sessionFactory”>   
  •            ref bean=”sessionFactory” />   
  • property>   
  • bean>   //实施事务管理的bean
          
               
    它是通过sessionFactory来管理,因此在传进来一个sessionFactory来接管事务处理。
    2、 声明式事务处理:
    在spring中对事务进行管理时,可以显示地进行事务处理的定义:
    Xml代码
  • //给事务添加的属性   
  • tx:advice id=”txAdvice” transaction-manager=”transactionManager”>   
  •      tx:attributes >   
  • //propagation表示的是事务的传播特性,使用required时,是当检测到add开头的方法时,就看此时有没有开启的事务,如果有则将方法放进事务中去,如果没有,则新建一个事务。然后将方法放进去。   
  •           tx:method name=”add*” propagation=”REQUIRED”>   
  •           tx:method name=”delete*” propagation=”REQUIRED”>   
  •            tx:method name=”update*” propagation=”REQUIRED”>   
  • //如果检测到其它的方法,则给其只读数据库的属性。即当本方法在读时,其它的方法不能再去写了。保证一个事务的完整性。   
  •            tx:method name=”*” read-only=”true”>   
  • tx:attributes>   
  • tx:advice>   //给事务添加的属性
         
    //propagation表示的是事务的传播特性,使用required时,是当检测到add开头的方法时,就看此时有没有开启的事务,如果有则将方法放进事务中去,如果没有,则新建一个事务。然后将方法放进去。
             
             
               
    //如果检测到其它的方法,则给其只读数据库的属性。即当本方法在读时,其它的方法不能再去写了。保证一个事务的完整性。
               
    对于事务的其它传播属性,则可以参考其它文档进行相关的了解。
    上一个配置是针对于所有包中类的事务处理方法的设置。下面一段是 的定义,它确保由 'txAdvice' bean定义的事务通知在应用中合适的点被执行。首先我们定义了 一个切面,它匹配 HibernateDAO 接口定义的所有操作,我们把该切面叫做 'allManagerMethod'。然后我们用一个通知器(advisor)把这个切面与 'txAdvice' 绑定在一起,表示当 'allManagerMethod' 执行时,'txAdvice' 定义的通知事务逻辑将被执行。这就是AOP切面工程:
    Xml代码
  • aop:config>   
  •       aop:pointcut id=”allManagerMethod”   
  • expression=”execution(*   com.hejianjiao.hibernate.HibernateDAO.*(..))”/>   
  • //调用上面配置的事务属性,可以将它给本aop pointcut。   
  •       aop:advisor advice-ref=”txAdvice” pointcut-ref=”allManagerMethod”/>   
  • //如果还有其它的定义,则可以再加上pointcut、advisor来定义本切面点的事务逻辑。   
  • aop:config>   
          
    //调用上面配置的事务属性,可以将它给本aop pointcut。
          
    //如果还有其它的定义,则可以再加上pointcut、advisor来定义本切面点的事务逻辑。
    //expression中的内容是要执行本切面的一个接口,中的所有方法:如:一个接口中定义了操作数据的方法:com.hejianjiao.hibernate.HibernateDAO,则下面execution括号中的内容就为:* com.hejianjiao.hibernate.HibernateDAO.*(..)。而如果在com.hejianjiao.hibernate包中还有其它的类也有操作方法,我们要一起定义的话,就可以写为:* com.hejianjiao.*.*(..),其中(..)表示的是方法,前面的第一个*是操作的接口或者类。
    上面的配置将为由 'HibernateDAO' 定义的bean创建一个代理对象,这个代理对象被装配了事务通知,所以当它的相应方法被调用时,一个事务将被启动、挂起、被标记为只读,或者其它(根据该方法所配置的事务语义)。

    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/47710/showart_1360894.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP