1.基本概念:
· Struts:Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来
实现的。由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的一年中颇受
关注。Struts把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统
一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时
间,所以说Struts是一个非常不错的应用框架。
· Spring:Spring是一个解决了许多在J2EE开发中常见的问题的强大框架。 Spring提供了管理
业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spring的架构基
础是基于使用JavaBean属性的Inversion of Control容器。然而,这仅仅是完整图景中的
一部分:Spring在使用IoC容器作为构建完关注所有架构层的完整解决方案方面是独一无二
的。Spring提供了唯一的数据访问抽象,包括简单和有效率的JDBC框架,极大的改进了效率
并且减少了可能的错误。Spring的数据访问架构还集成了Hibernate和其他O/R mapping解
决方案。Spring还提供了唯一的事务管理抽象,它能够在各种底层事务管理技术,例如JTA或
者JDBC事务提供一个一致的编程模型。Spring提供了一个用标准Java语言编写的AOP框
架,它给POJOs提供了声明式的事务管理和其他企业事务--如果你需要--还能实现你自己的
aspects。这个框架足够强大,使得应用程序能够抛开EJB的复杂性,同时享受着和传统EJB
相关的关键服务。Spring还提供了可以和IoC容器集成的强大而灵活的MVC Web框架。
· Hibernate:Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的
对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可
以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的
Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完
成数据持久化的重任。
2.整合:
1)Spring与Struts整合
主要有3种方式:
通过Spring的ActionSupport类、通过Spring的DelegatingRequestProcessor类、通过Spring的DelegatingActionProxy类。
使用ActionSupport虽然很方便,但是Struts的Action与Spring耦合在一起,并且Struts的Action不在Spring的控制之中,这样如果更换别的框架,或想使用Spring的AOP都是比较困难的,而且如果是多个动作放在一个Action中,则这种方式就无能为力了。
使用DelegatingRequestProcessor虽然解决了第一种带来的问题,但是还是有缺点的,那就是开发人员可以自己定义RequestProcessor,这样如果没有使用Struts默认的RequestProcessor,则需要手工来整合Spring和Struts了。
三者中,使用Spring的DelegatingActionProxy类来整合Spring和Struts的方式最为强大和灵活。第一部分的例子中我们就是用的DelegatingActionProxy类来整合。
我们结合上面的例子分析一下:
首先Struts中加载Spring context,需要在struts-config.xml文件中加入如下部分:
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /> </plug-in>
|
通过Struts的plug-in在Struts和Spring之间提供了良好的结合点。通过plug-in我们实现了Spring context的加载,不过仅仅加载Spring context并没有什么实际的意义,还应该经过配置将Struts的Action交给Spring容器进行管理。
如下部分:
<action-mappings> <action attribute="loginForm" input="/login.jsp" name="loginForm" scope="request" path="/login" validate="true" type="org.springframework.web.struts.DelegatingActionProxy"> </action> </action-mappings> |
在form bean这个节点上与传统的Struts配置没有什么区别,而在Action上面则发生了变化。在传统的action节点上type属性写入action类的完整类名,而和Spring结合后在这点上是使用了Spring提供的DelegatingActionProxy作为action的type属性,DelegatingActionProxy同样是org.apache.struts.action.Action的一个子类,它将把调用请求转交给真正的Action实现。通过这样的方式,Spring获得了Action实例的管理权,它将对Action进行调度,并为Struts提供所需的Action实例。这样,就可以将Action看作是Spring的一个bean,它就可以享受Spring的所有服务,如依赖注入、实例管理、事务管理等。
在applicationContext.xml中相应的配置如下的节点:
<bean name="/login" class="com.test.struts.action.LoginAction" singleton="false"> <property name="userDao"> <ref bean="userDao"/> </property> </bean>
|
最后这个bean的配置是关键,这个名为“/login”的bean与Struts中的
<action path="/login" ……>
……
</action>
节点相对应,这样,Spring Bean Name与Struts Action Path相关联,当Struts加载对应的Action时,DelegatingActionProxy就根据传入的path属性,在Spring Context寻找对应bean,并将其实例返回给Struts。与此同时,还可以看到,"/login" bean 中包含了一个userDAO 引用,Spring 在运行期将根据配置为其提供userDAO 实例,以及围绕userDAO 的事务管理服务。这样一来,对于Struts 开发而言,我们既可以延续Struts 的开发流程,也可以享受Spring 提供的事务管
理服务。而bean 的另外一个属性singleton="false",指明了Action 的实例获取方式为每次重新创建。这也解决了Struts中令人诟病的线程安全问题。
至此,SS组合已经将Struts MVC以及Spring中的Bean管理、事务管理融为一体。
2)Spring与Hibernate整合
Spring中对Hibernate的支持是非常强大的,从上面的例子就看得出来,我们直接来分析例子。
首先需要配置数据源,通常我们有两种方式获得Connection,一是自己编写代码获得连接,二是从JNDI环境中得到DataSource,然后产生一个Connection,这里我们不做论述。无论怎样,既然是spring下面的对象,就应该注册到配置文件中。例子中我们需要一个连接mysql下面一个叫做meonline的数据库,手动方式的配置是:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property>
|
<property name="url"> < |