Spring与Struts集成开发
最近喜欢将所学的东西理顺一下,且发现写blog可以达成这目的。
那就来整理一下我对Spring与Struts集成开发的一些想法。
首先确认系统的结构为三层的B/S模式结构,如下图:
在图中看出,Spring和Struts集成开发中,Spring在业务逻辑层被使用(集成)。因为Spring框架的依赖注入,AOP及可声明的事务管理方面的技术优势,使得用Spring来管理业务实体,实体之间的依赖关系,业务逻辑服务接口变得简单且可配置。至此我们要清楚:Spring和Struts集成开发中,Spring在业务逻辑层被使用(集成)。
清楚Struts和Spring在系统结构中分别充当的角色后,接下来要讨论:如何实现集成?
1、使用Spring的ActionSurpert类集成Struts。
org.springframework.web.struts.ActionSurpert是一个继承org.apache.struts.action.Action的类,简要代码如下:
public abstract class ActionSurpert extends Action {
private WebApplicationContext webApplicationContext;
public void setServlet(ActionServlet actionServlet) {//当容器实例化此Action时被容器调用
surper.setServlet(actionServlet);
if(actionServlet != null) {
this.webApplicationContext = initWebApplicationContext(actionServlet);//获取webApplicationContext
//........
}else{
//.......
}
}
//通过getXXX()方法获取 webApplicationContext 对象
protected final WebApplictionContext getWebApplicationContext() {
return this.webApplicationContext;
}
}
通过上述代码可以看出,所有继承了ActionSupport类的Action将可以通过WebApplicationContext对象的getBean(beanKey)方法获得Spring配置文件中定义的各种Bean。
WebApplicationContext要由Web Server来加载,有两种方法:
1、通过org.springframework.web.struts.ContextLoaderPlugIn加载,ContextLoaderPlugIn是个插件,需要在Struts配置文件中配置。
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property = "contextConfigLocation" value="/WEB-INF/applicationContext.xml"></set-property>
</plug-in>
2、在web.xml文件中加载
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
举个简单的例子说明一下相关配置信息:
假定有ExampleAction,ExampleBean,ExampleService这几个类,它们工作流程是:
用户请求ExampleAction,ExampleAction调用ExampleService的接口方法对ExampleBean进行相关的操作。
1、applicationContext.xml中配置相关的bean信息
<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/ssh?useUnicode=true&characterEncoding=UTF-8</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>root</value>
</property>
</bean>
<bean id="exampleBean" class="org.mypackge.beans.ExampleBean"/>
<bean id="exampleBeanService" class="org.mypackge.services.ExampleService"/>@
</beans>
通过这样配置后,在ExampleAction中可以用getWebApplicationContext() 获得webApplicationContext对象,然后通过
webApplicationContext的getBean(beanKey)方法获得相应的bean进行业务处理。标了红色的"beanKey"就是applicationContext.xml中<bean>元素定义的bean id,如:webApplicationContext.getBean("exampleBeanService")。@
当然,ExampleAction还要在stuts-config.xml配置文件中配置,这里不作介绍。
2、使用Spring的Action代理集成Struts
这种集成方式的核心思想是,将Struts的配置文件中的所有Action的type属性设为org.springframwork.web.struts.DelegationActionProxy。当用户请求Action时,就执行这代理,代理会在Spring应用上下文中找到真正的Action,然后交给它处理用户的请求。而真正用于处理用户请求的Action的配置放在了Spring的配置文件中。这样,Struts中的Action以及其依赖关系就可以用Spring容器来管理,比如将业务逻辑对象注入到Action中,供其使用。简单片段<bean name="/exampleAction" class="org.myproj.struts.actions.ExampleAction">
....
</bean>
说明:用name属性而不是用id来标识这个Bean,Spring不允许ID中出现"/",而name可以;"name"属性值要和struts-config.xml文件中相应<action>元素中的path属性值相同(<action path="/exampleAction"),这样Action代理才能找到相应的Action来处理请求。
欢迎讨论,提出宝贵意见。
posted on 2008-03-01 11:08
Sonny Li 阅读(808)
评论(2) 编辑 收藏 所属分类:
框架相关