struts整合spring的3中方法

我觉得首先要搞清楚的问题是为什么要集成,既然要集成,那就要问一下谁用了谁的什么。
struts和springmvc都是mvc框架,但是struts更流行易用,但是struts从分层上讲只是web层的东西,如果使用了spring,将在很多地方得到改善:
1 解除web层和业务层的耦合, web层只需要持有业务层的interface而不需要实例(实例通过spring注入/获得)
2 管理业务层组件的生命周期,不需要在action里面new这个,new那个.
3 aop支持以及声明式事务管理.
更多的好处估计我还没有想全.
spring为了和struts整合给出了3种方式,这3种方式的实现原理和作用效果都不一样.
3种做法我分别作了3个demo放在我的资源里面,http://download.csdn.net/source/1754187, zip包中共有3个project, ssh1, ssh2, ssh3,分别对应3种做法。需要注意的是为了减小体积,我只给ssh1带上了所有的jar包,测试的时候把ssh1的jar文件拷贝到ssh2, ssh3即可。可以下载下来边读文章边看代码.
1 struts的action继承自spring的ActionSupport,ActionSupport可以获得spring的ApplicationContext,因此就可以获得注入的业务层组件.
在struts-config.xml中配置ContextLoaderPlugIn(这3中方式都需要它加载spring配置文件,装载spring ioc, 下同略),

写Action:


可以看到上面的LoginAction需要UserService,但是我们已经不再采用UserService service = new UserServiceImpl();的写法了.UserService交给spring管理.
applicationContext.xml中配置业务组件UserService,

LoginForm,login.jsp和UserService代码都很简单,不说了,下载包中有. 部署测试.
这种做法的好处是简单易上手,最符合常规的思维.不是要spring管理业务组件么? 那就在Action中获得spring上下文即可. 但是这种做法却和spring的api耦合在一起了.离开了spring这个LoginAction就没用了. 还有一点就是这种方式还可以通过ContextLoaderListener来实现,而且不必使Action和spring耦合在一起.具体怎么做就不多说了.在web.xml中配置ContextLoaderListener.在Action中通过WebApplicationContextUtils获得spring上下文从而获得业务组件.

2 第二种做法; 替换请求处理器, 先来思考一下struts处理请求的流程:ActionServlet获得请求*.do, ActionServlet把请求委托给RequestProcessor, RequestProcessor根据请求的path在配置文件中找到对应的Action并实例化它. 调用Action的execute方法返回forward.如果对这个过程有疑问,可以阅读一下ActionServlet和RequestProcessor源代码.
如果可以改写一下请求处理器RequestProcessor, 让它在获得Action实例的时候从spring容器中获得Spring托管的Action,则spring不仅可以管理业务组件,还可以管理Action, 第二种做法正是这样做的.
在struts中配置controller用来替换默认的RequestProcessor,

LoginAction按照struts的写法,继承自Action. 同时对它依赖的组件UserService也不需要获取它的实例.

在applicationContext.xml中装配LoginAction和UserService,

其他配置照旧. 运行, 测试.
3 第三种做法: 使用spring的代理Action DelegatingActionProxy.这种做法是: struts的代码都不要动,不需要覆盖RequestProcessor,LoginAction仍然继承自Action, 只需要在struts-config.xml上改一下action的type: 

这个DelegatingActionProxy可以查找spring上下文中配置的Action,并执行它的execute方法.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值