Struts与Spring整合方法之一- -
最近用Struts,Spring做了一个程序,看了很多这方面的资料和代码。这篇是对Struts和Spring协同工作所需要做的工作的总结。
Struts和Spring协同工作有两种方法:
1. 一种是在Struts的Action中直接调用Spring的Bean;(就是原来一个路径对一个action的方法)
2. 另一种方式是将Struts的Action作为Spring Beans,由Spring进行管理。
要使Struts与Spring协同工作需要修改Struts的配置文件struts-config.xml和Spring的配置文件applicationContext.xml
修改struts-config.xml
- <struts-config>
- <plug-in
- className="org.springframework.web.struts.ContextLoaderPlugIn">
- <set-property property="contextConfigLocation"
- value="/WEB-INF/applicationContext.xml" />
- </plug-in>
- </struts-config>
通过
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts
- Configuration 1.2//EN"
- "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
- <struts-config>
- <!-- ================ Form Bean Definitions ================-->
- <form-beans>
- <form-bean name="userForm"
- type="org.apache.struts.validator.DynaValidatorForm">
- <form-property name="user" type="org.appfuse.model.User"/>
- </form-bean>
- </form-beans>
- <!-- ================ Action Mapping Definitions ================-->
- <action-mappings>
- <action path="/user"
- type="org.springframework.web.struts.DelegatingActionProxy"
- name="userForm" scope="request" parameter="method" validate="false">
- <forward name="list" path="/userList.jsp"/>
- <forward name="edit" path="/userForm.jsp"/>
- </action>
- </action-mappings>
- <!-- <action-mappings>
- <action path="/user"
- type="com.ctbr.springtest.web.action.UserAction"
- name="userForm" scope="request" parameter="method" validate="false">
- <forward name="list" path="/userList.jsp"/>
- <forward name="edit" path="/userForm.jsp"/>
- </action>
- </action-mappings>-->
- <!-- ================= Plug Ins Configuration ================-->
- <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
- <set-property property="contextConfigLocation"
- value="/WEB-INF/applicationContext.xml,
- /WEB-INF/action-servlet.xml"/>
- </plug-in>
- </struts-config>
在Action配置上也需要做修改,
我们试图在action-mapping 中增加一个名为userForm的Action,传统方式中,直接将类名作为action节点的type属性,Struts将根据type中的类名加载对应的Action实例。
而在面向SS组合的配置方式中,我们用Spring提供的DelegatingActionProxy 作为Action的type属性。DelegatingActionProxy同样是org.apache.struts.action.Action的一个子类,它将把调用请求转交给真正的Action实现。下面是DelegatingActionProxy的execute方法代码:
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
//获得实际的Action实例,并将请求转交
Action delegateAction = getDelegateAction(mapping);
return delegateAction.execute(mapping, form, request, response);
}
如此一来,Struts 在运行期加载的实际上是DelegatingActionProxy , 而DelegatingActionProxy则实现了针对实际Action的调用代理,Struts最终调用的将是由Spring管理的Action实例。
通过这样的方式,Spring 获得了对Action 实例的管理权,它将对Action进行调度,并为Struts提供所需的Action实例。既然Action已经由Spring全权接管,那么我们就可以将此Action看作是Spring中的一个Bean,它可享受Spring提供的所有服务(依赖注入、实例管理、事务管理等)。
与之对应,Spring Context配置如下:
applicationContext.xml:
- <?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.mysql.jdbc.Driver</value>
- </property>
- <property name="url">
- <value>jdbc:mysql://localhost:3306/bbs</value>
- </property>
- <property name="username">
- <value>bao</value>
- </property>
- <property name="password">
- <value>double</value>
- </property>
- </bean>
- <!-- DAO配置 -->
- <bean id="userDao" class="com.ctbr.springtest.dao.jdbc.UserDaoJdbc">
- <property name="dataSource">
- <ref bean="dataSource"/>
- </property>
- </bean>
- <bean id="postDao" class="com.ctbr.springtest.dao.jdbc.PostDaoJdbc">
- <property name="dataSource">
- <ref bean="dataSource"/>
- </property>
- </bean>
- <!-- <bean id="replyDAO" class="com.ctbr.springtest.dao.jdbc.ReplyDaoJdbc">
- <property name="postDao">
- <ref bean="postDAO" />
- </property>
- </bean>
- -->
- <!-- Service配置 -->
- <bean id="userService"
- class="com.ctbr.springtest.service.impl.UserServiceImpl"
- autowire="byType" />
- <bean id="postService"
- class="com.ctbr.springtest.service.impl.PostServiceImpl">
- <!-- <property name="replyDao">
- <ref bean="replyDao" />
- </property>-->
- </bean>
- <!-- Action配置 -->
- <bean name="/user" class="com.ctbr.springtest.web.action.UserAction"
- singleton="false">
- <property name="userService">
- <ref bean="userService"/>
- </property>
- </bean>
- </beans>