使用Spring 的 ActionSupport
使用Spring 的 DelegatingRequestProcessor 类
全权委托
无论用那种方法来整合第一步就是要为struts来装载spring的应用环境 就是在 struts 中加入一个插件
strutsconfigxml中
<plugin className=orgspringframeworkwebstrutsContextLoaderPlugIn>
<setproperty property=contextConfigLocation value=/WEBINF/applicationContextxml/>
</plugin>
spring 的配置文件被作为参数配置进来这样可以省略对webxml 文件中的配置确保你的applicationContextxml 在WEBINF目录下面
使用Spring的ActionSupport
Spring 的ActionSupport 继承至 orgapachestrutsactionAction ActionSupport的子类可以或得 WebApplicationContext类型的全局变量通过getWebApplicationContext()可以获得这个变量
这是一个 servlet 的代码
public class LoginAction extends orgspringframeworkwebstrutsActionSupport {
public ActionForward execute(ActionMapping mapping ActionForm form
HttpServletRequest request HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Autogenerated method stub
//获得 WebApplicationContext 对象
WebApplicationContext ctx = thisgetWebApplicationContext();
LoginDao dao = (LoginDao) ctxgetBean(loginDao);
User u = new User();
usetName(loginFormgetName());
usetPwd(loginFormgetPwd());
if(daocheckLogin(u)){
return mappingfindForward(success);
}else{
return mappingfindForward(error);
}
}
}
applicationContextxml 中的配置
<beans>
<bean id=loginDao class=comcaodaoLoginDao/>
</beans>
这中配置方式同直接在webxml文件配置差别不大注意Action继承自 orgspringframeworkwebstrutsActionSupport 使得struts和spring耦合在一起
但实现了表示层和业务逻辑层的解耦(LoginDao dao = (LoginDao) ctxgetBean(loginDao))
使用Spring 的 DelegatingRequestProcessor 类
DelegatingRequestProcessor 继承自 orgapachestrutsactionRequestProcessor 并覆盖了里面的方法
sturtsconfigxml 中 <controller processorClass=orgspringframeworkwebstrutsDelegatingRequestProcessor/> 通过 <controller >来替代orgapachestrutsactionRequestProcessor 的请求处理
public class LoginAction extends Action {
//利用spring来注入这个对象
private LoginDao dao ;
public void setDao(LoginDao dao) {
Systemoutprintln(执行注入);
thisdao = dao;
}
public LoginDao getDao() {
return dao;
}
public ActionForward execute(ActionMapping mapping ActionForm form
HttpServletRequest request HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Autogenerated method stub
//这样一改这行代码似乎没有必要了
//WebApplicationContext ctx = thisgetWebApplicationContext();
//LoginDao dao = (LoginDao) ctxgetBean(loginDao);
User u = new User();
usetName(loginFormgetName());
usetPwd(loginFormgetPwd());
//直接用dao来调用spring会将这个对象实例化
if(daocheckLogin(u)){
return mappingfindForward(success);
}else{
return mappingfindForward(error);
}
}
}
这里的
LoginAction extends Action 说明 struts 每有和spring 耦合
看一下
applicationContextxml 中的配置
<beans>
<bean id=loginDao class=comcaodaoLoginDao/>
<bean name=/login class=comcaostrutsactionLoginAction>
<property name=dao>
<ref local=loginDao/>
</property>
</bean>
</beans>
这里 name=/login 与struts 中的path匹配class=comcaostrutsactionLoginAction 与struts 中的type匹配
还要为 LoginAction 提供必要的setXXX方法 获得ApplicationCotext和依赖注入的工作都在DelegatingRequestProcessor中完成
全权委托
Action 的创建和对象的依赖注入全部由IOC容器来完成 使用Spring的DelegatingAcionProxy来帮助实现代理的工作orgspringframeworkwebstrutsDelegatingActiongProxy继承于orgapachestrutsactionAction
全权委托的配置方式同 方式 类似 (applcationContextxml文件的配置和 Action类的实现方式相同)
<strutsconfig>
<datasources />
<formbeans >
<formbean name=loginForm type=comcaostrutsformLoginForm />
</formbeans>
<globalexceptions />
<globalforwards />
<actionmappings >
<! type指向的是spring 的代理类 >
<action
attribute=loginForm
input=loginjsp
name=loginForm
path=/login
scope=request
type=orgspringframeworkwebstrutsDelegatingActionProxy >
<forward name=success path=/okjsp />
<forward name=error path=/errorjsp />
</action>
</actionmappings>
<messageresources parameter=comcaostrutsApplicationResources />
<plugin className=orgspringframeworkwebstrutsContextLoaderPlugIn>
<setproperty property=contextConfigLocation value=/WEBINF/applicationContextxml/>
</plugin>
</strutsconfig>
不同之处
<action>中 type指向的是spring 的代理类
去掉strutsconfigxml中 <controller >
三种整和方式中我们优先选用 全权委托的方式
理由
第一种使得过多的耦合了Spring和Action
RequestProcessor类已经被代理 如果要再实现自己的实现方式(如编码处理)怕有点麻烦
总结一下
整合工作中的步骤
修改strutsconfigxml
配置applicationContextxml
为Action添加get/set方法 来获得依赖注入的功能