先给出 Spring 的配置文件, applicationContext.xml:
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
< beans >
< bean id ="dataSource"
class ="org.springframework.jdbc.datasource.DriverManagerDataSource" >
< property name ="driverClassName" >
< value > com.microsoft.jdbc.sqlserver.SQLServerDriver </ value >
</ property >
< property name ="url" >
< value > jdbc:microsoft:sqlserver://localhost:1433;database=bookstoressh </ value >
</ property >
< property name ="username" >
< value > sa </ value >
</ property >
< property name ="password" >
< value > 123456 </ value >
</ property >
</ bean >
< bean id ="sessionFactory"
class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
< property name ="configLocation" >
< value > classpath:hibernate.cfg.xml </ value >
</ property >
< property name ="dataSource" >
< ref local ="dataSource" />
</ property >
</ bean >
在集成中主要是要配置 dataSource 和 sessionFacotyr 。 dataSource 主要是配置数据库的连接属性,而 sessionFactory 主要是用来管理 Hibernate 的配置,通过 classpath:hibernate.cfg.xml 直接装入 Hibernate 的配置文件,这样就仍然可以采用 Hibernate 自己的方式来配置 Hibernate 。
而 sessionFactory 有一个 dataSource 属性,需要注入一个 dataSource 。
实际上也可以在 Spring 的配置文件中来配置 Hibernate 如下:
class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
< property name ="configLocation" >
< value > classpath:hibernate.cfg.xml </ value >
</ property >
< property name ="dataSource" >
< ref local ="dataSource" />
</ property >
< property name ="mappingResources" >
< list >
< value > <!-- 这里填写hibernate的映射文件路径 --> </ value >
</ list >
</ property >
< property name ="hibernateProperties" >
< props >
<!-- 配置Hibernate的方言 -->
< prop key ="hibernate.dialect" >
org.hibernate.dialect.SQLServerDialect
</ prop >
<!-- 输入由Hibernate生成的SQL语句,如果在hibernate.cfg.xml中也指定的话,会生成两条语句,在产品中最好关闭,即设为false -->
< prop key ="show_sql" > true </ prop >
</ props >
</ property >
</ bean >
Spring 和 Hibernate 的集成比较简单,通过上面的配置,就已经完成了。
下面是 Spring 和 Struts 的集成,这部分比较复杂。
一、 Spring 集成 Struts
Spring 集成 Struts 主要有两种上下文装载方式和三种整合方法:
u 两种上下文装载方式:
(1) 在 struts-config.xml 中通过插件的方式装载 Spring 上下文,如下:
< plug-in className ="org.springframework.web.struts.ContextLoaderPlugIn" >
< set-property property ="contextConfigLocation"
value ="/WEB-INF/applicationContext.xml" />
</ plug-in >
这种方式在整合的时候,有时会产生 Action 的无效,即不能正常实例化一个 Action ,一个原因是版本的问题,另一个原因是引入了 Hibernate 的 annotation 库,估计仍然是版的问题。
(2) 在 web.xml 文件中装载 Spring 上下文,如下:
如果不支持 Servlet2.4 ,则采用下面的配置:
< param-name > contextConfigLocation </ param-name >
< param-value > /WEB-INF/applicationContext.xml </ param-value >
</ context-param >
< servlet >
< servlet-name > SpringContextServlet </ servlet-name >
< servlet-class >
org.springframework.web.context.ContextLoaderServlet
</ servlet-class >
< load-on-startup > 1 </ load-on-startup >
</ servlet >
< context-param >
< param-name > contextConfigLocation </ param-name >
param-value>/WEB-INF/applicationContext.xml </ param-value >
</ context-param >
<!-- 这是Servlet2.4的规范,如果不支持Servlet2.4规范,则采用ContextLoaderServlet -->
< listener >
< listener-class > org.springframework.web.context.ContextLoaderListener </ listener-class >
</ listener >
u Spring 集成 Struts 的三种方式:
(1) Struts 的每一个具体的 Action 直接继承 Spring 的 ActionSupport ,例如:
private UserDAO getUserDAO() {
return (UserDAO) getWebApplicationContext().getBean( " userDAO " );
}
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
getUserDAO().save(User);
return null ;
}
}
这样的话,就可以使用 getWebApplicationContext().getBean() 方式来使用在 Spring 的配置的 Bean 了。但 使用这种方式的话,每一个 Action 都和 Spring 框架耦合在一起了,一般不采用。
(2) 使用Spring 的DelegatingRequestProcessor 覆盖Struts 的RequestProcess ,在Struts 的配置文件struts-config.xml 文件中加入如下内容:
processorClass ="org.springframework.web.struts.DelegatingRequestProcessor" />
这样的话,就可以由Spring 的Bean 的方式来管理Struts 的Action 。 这种设计使 Struts 动作并不知道它正被 Spring 管理,并且使您能够利用 Spring 框架的所有优点。由于Struts 动作注意不到 Spring 的存在,所以不需要重写Struts 代码就可以使用其他控制反转容器来替换掉 Spring 。DelegatingRequestProcessor 方法的确比第一种方法好,但是仍然存在一些问题。如果使用一个不同的 RequestProcessor ,则需要手动整合 Spring 的 DelegatingRequestProcessor 。
(3) 使用代理将Struts 的Action 委托给Spring 管理
先看一下在struts-config.xml 中的Action 的配置:
input ="/login.jsp"
name ="loginForm" path ="/login" scope ="request"
type ="org.springframework.web.struts.DelegatingActionProxy" >
< forward name ="success" path ="/success.jsp" />
</ action >
通过type 属性指定为 org.springframework.web.struts.DelegatingActionProxy 将这个 Action 委托给 Spring 进行管理。 它注册 Spring 代理类的名称,而不是声明动作的类名。DelegatingActionProxy 类使用动作映射名称查找 Spring 环境中的动作。
下面看一下 Spring 的配置文件中的配置:
< bean name ="/login"
class ="com.test.struts.action.LoginAction"
singleton
="false" autowire ="byType" >
</ bean >
class ="com.test.struts.action.LoginAction"
singleton ="false" autowire ="byType" >
</ bean >
在Bean 的配置中,是通过name 属性而不是id 属性,因为id 属性在DTD 验证中的类型为ID ,而ID 类型,ID 类型必须以字母、下划线或冒号开头,不允许使用非法字符,而”/” 是非法字符。另外,name 属性的值是非常重要的,它一定要和在struts-config.xml 中配置的Action 的path 属性的值一致。 DelegatingActionProxy 会通过 path 属性的值在 Spring 的上下文环境中查找真正的 Action 。而 Bean 的 class 属性则指定了真正实现 Struts 的 Action 的具体类。这样就将 Struts 的 Action 交给了 Spring 来管理。