小毅總結(jié)之--->spring整合struts的三種方式
Posted on 2008-10-12 00:45 H2O 閱讀(857) 評論(1) 編輯 收藏 所屬分類: Spring+Struts+Hibernate整合方式一:使用 Spring 的 ActionSupport或DispachActionSupport 類整合 Structs
Action
package com.yz.actions.action;

import java.lang.reflect.InvocationTargetException;
import javax.servlet.http.*;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.struts.action.*;
import org.springframework.web.struts.DispatchActionSupport;
import com.yz.services.*;
import com.yz.actions.form.*;
import com.yz.vo.UserVo;
//spring的action管理請求
public class UserAction extends DispatchActionSupport {
//針對接口編程
IUserServices ius;
public IUserServices getIus() {
return ius;
}

public void setIus(IUserServices ius) {
this.ius = ius;
}

public ActionForward test(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
UserForm userForm = (UserForm) form;
UserVo uv = new UserVo();
try {
BeanUtils.copyProperties(uv, userForm);
} catch (Exception e) {
e.printStackTrace();
}
/*IUserServices ius = new IUserServicesImpl();*/
//通過父類的方法獲取spring容器 并得到其中的bean對象
ius =(IUserServices)super.getWebApplicationContext().getBean("ius");
boolean add = ius.addUsers(uv);
System.out.println(uv.getUserName());
String url = "/error.jsp";
if(add){
url = "/ok.jsp";
}
System.out.println(url);
return new ActionForward(url) ;
}
}
自己寫的請求處理器,處理中文亂碼
package com.yz.myReq;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.RequestProcessor;

public class myReq extends RequestProcessor
struts-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
<data-sources />
<form-beans >
<form-bean name="userForm" type="com.yz.actions.form.UserForm" />

</form-beans>

<global-exceptions />
<global-forwards />
<action-mappings >
<action
attribute="userForm"
name="userForm"
path="/user"
scope="request"
type="com.yz.actions.action.UserAction"
parameter="actions"
/>
</action-mappings>
<controller processorClass="com.yz.myReq.myReq"></controller>
<message-resources parameter="com.yz.actions.ApplicationResources" />
<!-- 添加一個插件,用來在啟動struts框架的時候,
同時讀取spring配置文件,啟動spring容器 -->
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml"/>
</plug-in>
</struts-config>

applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<bean id="userDaoImpl" class="com.yz.dao.impl.IuserDaoImpl"></bean>
<!-- action里面有一個ius(service的接口引用),
他來自 com.yz.services.impl.IUserServicesImpl(指向接口的實現(xiàn)類)
IUserServicesImpl里面有一個iud(IuserDao接口引用)
他 ref id為 userDaoImpl(指向接口的實現(xiàn)類)
-->
<bean id="ius" class="com.yz.services.impl.IUserServicesImpl">
<property name="iud">
<ref bean="userDaoImpl"/>
</property>
</bean>
</beans>
<!--
整合思路:
1、通過從 Spring 的 ActionSupport或者DispachActionSuport 類而不是 Struts 的 Action 類進(jìn)行擴展,創(chuàng)建了一個新的 Action,
2、使用 getWebApplicationContext() 方法獲得一個 ApplicationContext。為了獲得spring容器上下文對象,從而查找一個 Spring bean。

優(yōu)缺點:
1、這種技術(shù)很簡單并且易于理解。
2、它將 Struts 動作與 Spring 框架耦合在一起。如果您想替換掉 Spring,那么您必須重寫代碼。并且,由于 Struts 動作不在 Spring 的控制之下,所以它不能獲得 Spring AOP 的優(yōu)勢。當(dāng)使用多重獨立的 Spring 環(huán)境時,這種技術(shù)可能有用,但是在大多數(shù)情況下,這種方法不如另外兩種方法合適。

-->
方式二:使用 Spring 的 DelegatingRequestProcessor 覆蓋 Struts 的 RequestProcessor
Action
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.yz.actions.action;

import java.lang.reflect.InvocationTargetException;
import javax.servlet.http.*;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.struts.action.*;
import org.apache.struts.actions.*;
import org.springframework.web.struts.DispatchActionSupport;

import com.yz.actions.form.UserForm;
import com.yz.services.IUserServices;
import com.yz.services.impl.IUserServicesImpl;
import com.yz.vo.UserVo;
//spring的action管理請求
public class UserAction extends DispatchAction {
//針對接口編程
IUserServices ius;
public IUserServices getIus() {
return ius;
}

public void setIus(IUserServices ius) {
this.ius = ius;
}

public ActionForward test(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
UserForm userForm = (UserForm) form;
UserVo uv = new UserVo();
try {
BeanUtils.copyProperties(uv, userForm);
} catch (Exception e) {
e.printStackTrace();
}
boolean add = ius.addUsers(uv);
System.out.println(uv.getUserName());
String url = "/error.jsp";
if(add){
url = "/ok.jsp";
}
System.out.println(url);
return new ActionForward(url) ;
}
}
繼承自spring的請求處理器替換帶哦struts的請求處理器,順便處理編碼問題。
package com.yz.myReq;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.struts.DelegatingRequestProcessor;
//spring的請求處理器

public class mySpringRequestProccessor extends DelegatingRequestProcessor {

@Override
protected boolean processPreprocess(HttpServletRequest req,
HttpServletResponse resp) {
try {
req.setCharacterEncoding("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
resp.setCharacterEncoding("utf-8");
return super.processPreprocess(req, resp);
}
}
struts-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
<data-sources />
<form-beans >
<form-bean name="userForm" type="com.yz.actions.form.UserForm" />

</form-beans>

<global-exceptions />
<global-forwards />
<action-mappings >
<action
attribute="userForm"
name="userForm"
path="/user"
scope="request"
type="com.yz.actions.action.UserAction"
parameter="actions"
/>
</action-mappings>
<!-- spring的請求處理器 自己寫的類繼承他,加了中文亂碼處理
這樣在actionservlet得到action的時候,就是從spring容器中去
獲取name和path匹配的對象 -->
<controller processorClass="com.yz.myReq.mySpringRequestProccessor"></controller>
<message-resources parameter="com.yz.actions.ApplicationResources" />
<!-- 添加一個插件,用來在啟動struts框架的時候,
同時讀取spring配置文件,啟動spring容器 -->
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml"/>
</plug-in>
</struts-config>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<bean id="userDaoImpl" class="com.yz.dao.impl.IuserDaoImpl"></bean>
<!-- action里面有一個ius(service的接口引用),
他來自 com.yz.services.impl.IUserServicesImpl(指向接口的實現(xiàn)類)
IUserServicesImpl里面有一個iud(IuserDao接口引用)
他 ref id為 userDaoImpl(指向接口的實現(xiàn)類) /user
-->
<bean id="intfUs" class="com.yz.services.impl.IUserServicesImpl">
<property name="iud">
<ref bean="userDaoImpl"/>
</property>
</bean>
<!-- name必須和action的path一致 -->
<bean name="/user" class="com.yz.actions.action.UserAction">
<property name="ius" ref="intfUs"></property>
</bean>
</beans>
<!--
整合思路:
DelegatingRequestProcessor替換struts的請求處理器,根據(jù)struts配置的action中path屬性與applicationContext.xml中配置的bean的name屬性找到相應(yīng)的action。
優(yōu)缺點:
1、這種設(shè)計使 Struts 動作并不知道它正被 Spring 管理,并且使您能夠利用 Sping 的動作管理框架的所有優(yōu)點。由于您的 Struts 動作注意不到 Spring 的存在,所以您不需要重寫您的 Struts 代碼就可以使用其他控制反轉(zhuǎn)容器來替換掉 Spring。
2、DelegatingRequestProcessor 方法的確比第一種方法好,但是仍然存在一些問題。如果您使用一個不同的 RequestProcessor,則需要手動整合 Spring 的 DelegatingRequestProcessor。添加的代碼會造成維護的麻煩并且將來會降低您的應(yīng)用程序的靈活性。此外,還有過一些使用一系列命令來代替 Struts RequestProcessor 的傳聞。 這種改變將會對這種解決方法的使用壽命造成負(fù)面的影響。


-->
方式三:將 Struts Action 管理委托給 Spring 框架,使用代理
Action
package com.yz.actions.action;

import java.lang.reflect.InvocationTargetException;
import javax.servlet.http.*;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.struts.action.*;
import org.apache.struts.actions.*;
import org.springframework.web.struts.DispatchActionSupport;

import com.yz.actions.form.UserForm;
import com.yz.services.IUserServices;
import com.yz.services.impl.IUserServicesImpl;
import com.yz.vo.UserVo;
//spring的action管理請求
public class UserAction extends DispatchAction {
//針對接口編程
IUserServices ius;
public IUserServices getIus() {
return ius;
}

public void setIus(IUserServices ius) {
this.ius = ius;
}

public ActionForward test(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
UserForm userForm = (UserForm) form;
UserVo uv = new UserVo();
try {
BeanUtils.copyProperties(uv, userForm);
} catch (Exception e) {
e.printStackTrace();
}
boolean add = ius.addUsers(uv);
System.out.println(uv.getUserName());
String url = "/error.jsp";
if(add){
url = "/ok.jsp";
}
System.out.println(url);
return new ActionForward(url) ;
}
}
代理
package com.yz.myActionProxy;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.web.struts.DelegatingActionProxy;


public class mySpringActionProxy extends DelegatingActionProxy {

@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
ServletRequest req, ServletResponse resp) throws Exception {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
return super.execute(mapping, form, request, response);
}
}
struts-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
<data-sources />
<form-beans >
<form-bean name="userForm" type="com.yz.actions.form.UserForm" />

</form-beans>

<global-exceptions />
<global-forwards />
<action-mappings >
<action
attribute="userForm"
name="userForm"
path="/user"
scope="request"
type="com.yz.myActionProxy.mySpringActionProxy"
parameter="actions"
/>
</action-mappings>
<controller processorClass="com.yz.myReq.myReq"></controller>
<message-resources parameter="com.yz.actions.ApplicationResources" />
<!-- 添加一個插件,用來在啟動struts框架的時候,
同時讀取spring配置文件,啟動spring容器 -->
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml"/>
</plug-in>
</struts-config>

applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<bean id="userDaoImpl" class="com.yz.dao.impl.IuserDaoImpl"></bean>
<!-- action里面有一個ius(service的接口引用),
他來自 com.yz.services.impl.IUserServicesImpl(指向接口的實現(xiàn)類)
IUserServicesImpl里面有一個iud(IuserDao接口引用)
他 ref id為 userDaoImpl(指向接口的實現(xiàn)類) /user
-->
<bean id="intfUs" class="com.yz.services.impl.IUserServicesImpl">
<property name="iud">
<ref bean="userDaoImpl"/>
</property>
</bean>
<!-- name必須和action的path一致 -->
<bean name="/user" class="com.yz.actions.action.UserAction">
<property name="ius" ref="intfUs"></property>
</bean>
</beans>
<!--
整合思路:
1、 將 Strut 動作管理委托給 Spring。
2、您可以通過在 struts-config 動作映射中注冊一個代理來實現(xiàn)。代理負(fù)責(zé)在 Spring 環(huán)境中查找 Struts 動作。由于動作在 Spring 的控制之下,所以它可以填充動作的 JavaBean 屬性,并為應(yīng)用諸如 Spring 的 AOP 攔截器之類的特性帶來了可能。
優(yōu)缺點:
1、動作委托解決方法是這三種方法中最好的。 Struts 動作不了解 Spring,不對代碼作任何改變就可用于非 Spring 應(yīng)用程序中。RequestProcessor 的改變不會影響它,并且它可以利用 Spring AOP 特性的優(yōu)點。
2、動作委托的優(yōu)點不止如此。一旦讓 Spring 控制您的 Struts 動作,您就可以使用 Spring 給動作補充更強的活力。例如,沒有 Spring 的話,所有的 Struts 動作都必須是線程安全的。如果您設(shè)置 標(biāo)記的 singleton 屬性為“false”,那么不管用何種方法,您的應(yīng)用程序都將在每一個請求上有一個新生成的動作對象。您可能不需要這種特性,但是把它放在您的工具箱中也 很好。您也可以利用 Spring 的生命周期方法。例如,當(dāng)實例化 Struts 動作時, 標(biāo)記的 init-method 屬性被用于運行一個方法。類似地,在從容器中刪除 bean 之前,destroy-method 屬性執(zhí)行一個方法。這些方法是管理昂貴對象的好辦法,它們以一種與 Servlet 生命周期相同的方式進(jìn)行管理
-->
Action














































自己寫的請求處理器,處理中文亂碼











struts-config.xml

































applicationContext.xml



































方式二:使用 Spring 的 DelegatingRequestProcessor 覆蓋 Struts 的 RequestProcessor
Action

















































繼承自spring的請求處理器替換帶哦struts的請求處理器,順便處理編碼問題。
























struts-config.xml


































applicationContext.xml







































方式三:將 Struts Action 管理委托給 Spring 框架,使用代理
Action














































代理
























struts-config.xml

































applicationContext.xml





































