浏览 1640 次
锁定老帖子 主题:struts和spring的整合方式
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-07
最近用Struts,Spring做了一个程序,看了很多这方面的资料和代码。这篇是对Struts和Spring协同工作所需要做的工作的总结。 Struts和Spring协同工作有两种方法: 一种是在Struts的Action中直接调用Spring的Bean;另一种方式是将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> 通过plug-in我们实现了Spring Context的加载,我们还需要修改配置,将Struts Action交给Spring容器进行管理: <?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配置中包含了loginForm的两种配置形式,第一种是面向改造后的形式,第二种(作为注释)是与之对应的传统Struts配置方式。 我们试图在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> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |