實例講解spring整合struts的幾種方式

[size=small]實例講解spring整合struts的幾種方式

1,使用Spring 的 ActionSupport

2, 使用Spring 的 DelegatingRequestProcessor 類。

3,全權委託。


無論用那種方法來整合第一步就是要爲struts來裝載spring的應用環境。 就是在 struts 中加入一個插件。

struts-config.xml中


<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">

<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>

</plug-in>


spring 的配置文件被作爲參數配置進來。這樣可以省略對web.xml 文件中的配置。確保你的applicationContext.xml 在WEB-INF目錄下面


1,使用Spring的ActionSupport .

Spring 的ActionSupport 繼承至 org.apache.struts.action.Action

ActionSupport的子類可以或得 WebApplicationContext類型的全局變量。通過getWebApplicationContext()可以獲得這個變量。


這是一個 servlet 的代碼:

public class LoginAction extends org.springframework.web.struts.ActionSupport {


public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub

//獲得 WebApplicationContext 對象

WebApplicationContext ctx = this.getWebApplicationContext();

LoginDao dao = (LoginDao) ctx.getBean("loginDao");

User u = new User();

u.setName(loginForm.getName());

u.setPwd(loginForm.getPwd());

if(dao.checkLogin(u)){

return mapping.findForward("success");

}else{

return mapping.findForward("error");

}

}

}


applicationContext.xml 中的配置

<beans>

<bean id="loginDao" class="com.cao.dao.LoginDao"/>

</beans>


這中配置方式同直接在web.xml文件配置差別不大。注意:Action繼承自 org.springframework.web.struts.ActionSupport 使得struts和spring耦合在一起。

但實現了表示層和業務邏輯層的解耦
(LoginDao dao = (LoginDao) ctx.getBean("loginDao"))


2,使用Spring 的 DelegatingRequestProcessor 類

DelegatingRequestProcessor 繼承自 org.apache.struts.action.RequestProcessor 並覆蓋了裏面的方法。

sturts-config.xml 中
<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/> 通過 <controller >來替代

org.apache.struts.action.RequestProcessor 的請求處理。


public class LoginAction extends Action {

//利用spring來注入這個對象。

private LoginDao dao ;


public void setDao(LoginDao dao) {

System.out.println("執行注入");

this.dao = dao;

}

public LoginDao getDao() {

return dao;

}


public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub

//這樣一改這行代碼似乎沒有必要了。

//WebApplicationContext ctx = this.getWebApplicationContext();

//LoginDao dao = (LoginDao) ctx.getBean("loginDao");

User u = new User();

u.setName(loginForm.getName());

u.setPwd(loginForm.getPwd());

//直接用dao來調用spring會將這個對象實例化。

if(dao.checkLogin(u)){

return mapping.findForward("success");

}else{

return mapping.findForward("error");

}

}

}


這裏的。

LoginAction extends Action 說明 struts 每有和spring 耦合。

看一下

applicationContext.xml 中的配置。

<beans>

<bean id="loginDao" class="com.cao.dao.LoginDao"/>

<bean name="/login" class="com.cao.struts.action.LoginAction">

<property name="dao">

<ref local="loginDao"/>

</property>

</bean>

</beans>


這裏 name="/login" 與struts 中的path匹配 class="com.cao.struts.action.LoginAction" 與struts 中的type匹配還要爲 LoginAction 提供必要的setXXX方法。 獲得ApplicationCotext和依賴注入的工作都在DelegatingRequestProcessor中完成。


3,全權委託:

Action 的創建和對象的依賴注入全部由IOC容器來完成。 使用Spring的DelegatingAcionProxy來幫助實現代理的工作

org.springframework.web.struts.DelegatingActiongProxy繼承於org.apache.struts.action.Action .


全權委託的配置方式同 方式 2 類似 (applcationContext.xml文件的配置和Action類的實現方式相同)。

<struts-config>

<data-sources />

<form-beans >

<form-bean name="loginForm" type="com.cao.struts.form.LoginForm" />

</form-beans>


<global-exceptions />

<global-forwards />

<action-mappings >

<!-- type指向的是spring 的代理類 -->

<action

attribute="loginForm"

input="login.jsp"

name="loginForm"

path="/login"

scope="request"

type="org.springframework.web.struts.DelegatingActionProxy" >

<forward name="success" path="/ok.jsp" />

<forward name="error" path="/error.jsp" />

</action>


</action-mappings>

<message-resources parameter="com.cao.struts.ApplicationResources" />

<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">

<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>

</plug-in>

</struts-config>

不同之處

1, <action>中 type指向的是spring 的代理類

2, 去掉struts-config.xml中 <controller >


三種整和方式中我們優先選用全權委託的方式。

理由:

1,第一種使得過多的耦合了Spring和Action .

2,RequestProcessor類已經被代理 如果要再實現自己的實現方式(如:編碼處理)怕有點麻煩。


總結一下:

整合工作中的步驟:

1,修改struts-config.xml

2, 配置applicationContext.xml

3, 爲Action添加get/set方法 來獲得依賴注入的功能。
[/size]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章