Struts + Spring + Hibernate

 一. Struts + Spring

   1.1  利用Struts的PlugIn启动Spring容器

          在使用Spring的Web应用时,不用手动创建Spring容器,而是通过配置文件声明式地创建Spring容器,可以直接在web.xml文件中配置创建Spring容器,为了让Spring容器在web工程启动时自动启动,可以采用如下方式:

          a.采用ServletContextListener实现

          b.采用load-on-startup Servlet实现

        Spring提供ServletContextListener的一个实现类ContextLoaderListener,该类可以作为Listener使用,会在创建时自动查找web-inf下的ApplicationContext.xml文件,因此,只需要在web.xml中加入如下语句:

 

 

  持此之外,Spring提供一个特殊的Servlet类ContextLoaderServlet,该Servlet在启动时,会自动查找WEB-INF下的ApplicationContext.xml文件

  在web.xml加入如下语句

 

 

 

  Listener比Servlet优先加载,因此采用ContextLoaderListener创建ApplicationContext的时机更早。

 

  另一种情况是,利用第三方MVC框架的扩展点来创建Spring容器,Struts有一个扩展点PlugIn,Spring正是利用了PlugIn这个扩展点,实现了与Struts的整合,Spring提供PlugIn接口的实现类org.springframework.web.struts.Contextloaderplugin,这实现类可以作为Struts的PlugIn配置,当Struts框架启动时,会自动创建SPring容器

 

二.MVC框架与Spring整合的思考

  如果一个类中关联另一个类,采用new的方式直接创建该类的对象是最不理智的方式,这样会使类与类之间耦合紧密,如果让控制器创建业务逻辑组件,本身逻辑上就有问题,因为控制器是业务逻辑组件的使用者,它不应该关心业务逻辑组件的实现。

  这个问题的解决方案在于,采用工厂模式或者服务定位器

  采用工厂模式中,控制器与业务逻辑组件的实现分离,所有的业务逻辑组件的创建有工厂负责,业务逻辑组件的运行也有工厂负责(业务逻辑组件的创建和运行都由工厂负责),控制器只需要定位工厂实例即可。

  采用Spring框架,Spring的Ioc容器就是最大的工厂,负责业务逻辑组件的创建和生成,并且管理业务逻辑组件的生命周期,程序员有很多因素不需要考虑,客户端代码异常简单,一切操作控制都有Spring容器完成,Spring是一个性能非常优秀的工厂,可以生产出所有的实例,从业务逻辑组件,到持久化组件,甚至控制器,都由Spring容器负责创建并且进行管理。

 

  问题是,采用Spring框架,如何让控制器组件定位到业务逻辑组件

  普遍的实现方案是,充分利用Spring容器的IoC特性,让控制器成为Spring容器管理的bean组件,这样由Spring容器创建并且管理Action,并且负责业务逻辑组件的依赖注入。

  这种整合方案的一个问题是,核心控制器如何将用户的请求转发给Spring容器中的Action?在原始的Struts框架中,请求的转发都是由RequestProcessor完成的,现在若要将请求转发给Spring容器中的bean,不能够使用原来的RequestProcessor,一种实现策略是,不使用Struts中原来的RequestProcessor使用Spring框架提供的DelegationRequestProcessor,Spring提供的DelegationRequestProcessor继承RequestProcessor,具有RequestProcessor提供的所有功能,为了让Struts使用DelegatingRequestProcessor,需要在struts-config.xml中配置

  <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/>

完成这个配置后,Struts会拦截用户请求转发到Spring context下的bean,这个时候,控制器组件由Spring容器负责创建并且管理,因此,在struts-config.xml文件中无需指定控制器的实现类。

  在web.xml文件中配置Struts框架的加载,因为使用Spring管理Struts的Action,而Action随HTTP请求启动,因此,应将Action的作用域配置成为Request,为了使用Request作用域,需要在web.xml中进行相应的配置

  <filter>

    <filter-name>requestContextFilter</filter-name>

    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>

</filter>

 定义filter,是使用Request作用域的基础

 <filter-mapping>

    <filter-name>requestContextFilter</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>

这个映射关系可以让Filter过滤所有的用户请求

 

  这里需要了解的一点是:实现类之间松耦合有三个方面:工厂模式,面向接口编程,配置文件进行依赖注入

   采用最本的方法时(即new),类A要和类B的接口关联,和类B的实现类关联,和类B的工厂实例关联

   采用工厂模式时,类A和类B的接口关联,和类B的工厂实例关联

   采用Spring IoC容器作为工厂时,类A只和类B的接口关联

 

  

 三. Spring和Hibernate的整合

   3.1 Spring提供的DAO模式

   DAO模式是一种标准的J2EE模式,DAO模式的核心思想是,所有的数据库访问,都通过DAO组件完成,DAO组件封装了数据库的增删改查操作,业务逻辑组件依赖DAO组件提供的数据库原子操作,完成系统业务逻辑的实现,这样看来,控制器依赖业务逻辑组件完成用户需求,返回执行结果,业务逻辑组件依赖DAO组件实现具体的业务逻辑,而DAO组件依赖持久化组件实现数据库操作 ,正是由于这些组件之间具有这样的依赖关系,才能够使Spring IoC容器充分发挥它的作用,实现类之间的松耦合,组件只需要面向接口编程,无需关心类的具体实现,甚至无需定位工厂对象。  

  Spring容器管理表现层的Action,向下管理业务逻辑层组件,管理DAO组件,各层之间负责传值的对象值对象,也就是JavaBean

  Spring提供一系列的抽象类,这些抽象类将被  作为应用中DAO实现类的父类,通过继承这些类,Spring简化了DAO的开发步骤,能以一致的方式使用数据库访问技术,应用DAO继承Spring提供的抽象类,会大大简化应用的开发,而且,继承这些类能够一一致的方式访问数据库,应用程序不需要在不同的持久层访问技术中切换。

  3.2 利用Hibernate关键的一点是管理SessionFactory,Hibernate的SessionFactory是数据库编译有的内存镜像,一个J2EE应用对应一个数据库,对应一个SessionFactory对象

  可以在Spring 的IoC容器中配置SessionFactory Bean和DataSource数据源,他将随应用的启动而加载,Spirng IoC容器负责创建SessionFactory实例,并且可以将SessionFactory注入任何Bean中

  3.3 Spring提供HibernateTemplate持久层访问模板,DAO组件中使用HibernateTemplate类,可以大大简化DAO组件的开发,HibernateTemplate提供了访问数据库的接口,它只需要一个SessionFactory,而这个SessionFactory可以通过Spring IoC容器进行依赖注入。

  3.4 HibernateCallBack

  Spring框架有一个特点,它提供了访问数据库的简便的API HibernateTemplate,同时为了保证灵活性,会提供用一个HibernateCallBack,这样可以使用户完全以原始的Hibenate方式进行数据库访问。

  HibernateCallBack是一个接口,实现这个接口必须实现doInHibernate方法

 3.5 实现DAO组件

  为了实现DAO组件,Spring提供了大量的DaoSupport类,这些DAO支持类对于实现DAO组件大有帮助,因为这些DAO支持类已经完成了大量基础性的工作,Spring为Hibernate的DAO提供了工具类HibernateDaoSupport,该类主要提供如下两个方法以方便DAO的实现

getHibernateTemplate 和set

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值