使用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方法 來獲得依賴注入的功能
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28711.html