先给出Spring的配置文件,applicationContext.xml:
这种方式在整合的时候,有时会产生Action的无效,即不能正常实例化一个Action,一个原因是版本的问题,另一个原因是引入了Hibernate的annotation库,估计仍然是版的问题。
(2)在web.xml文件中装载Spring上下文,如下:
如果不支持Servlet2.4,则采用下面的配置:
Spring集成Struts的三种方式:
(1) Struts的每一个具体的Action直接继承Spring的ActionSupport ,例如:
这样的话,就可以使用getWebApplicationContext().getBean()方式来使用在Spring的配置的Bean了。但使用这种方式的话,每一个Action都和Spring框架耦合在一起了,一般不采用。
(2) 使用Spring的DelegatingRequestProcessor覆盖Struts的RequestProcess,在Struts的配置文件struts-config.xml文件中加入如下内容:
<controller 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的配置:
<action attribute="loginForm" 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>
在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来管理。
public class LoginAction extends 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;
}
}
<context-param> <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>
<?xml version="1.0" encoding="UTF-8"?> <!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如下:
<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> <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主要有两种上下文装载方式和三种整合方法:
两种上下文装载方式:
(1) 在struts-config.xml中通过插件的方式装载Spring上下文,如下:
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /> </plug-in>