方式一:使用 Spring 的 ActionSupport或DispachActionSupport 類整合 Structs
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) ;
}
}
自己寫的請求處理器,處理中文亂碼
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 {
@Override
protected boolean processPreprocess(HttpServletRequest request, HttpServletResponse response) {
try {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return super.processPreprocess(request, response);
}
}
struts-config.xml
<!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
<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(指向接口的實現類)
IUserServicesImpl裏面有一個iud(IuserDao接口引用)
他 ref id爲 userDaoImpl(指向接口的實現類)
-->
<bean id="ius" class="com.yz.services.impl.IUserServicesImpl">
<property name="iud">
<ref bean="userDaoImpl"/>
</property>
</bean>
</beans>
整合思路:
1、通過從 Spring 的 ActionSupport或者DispachActionSuport 類而不是 Struts 的 Action 類進行擴展,創建了一個新的 Action,
2、使用 getWebApplicationContext() 方法獲得一個 ApplicationContext。爲了獲得spring容器上下文對象,從而查找一個 Spring bean。
優缺點:
1、這種技術很簡單並且易於理解。
2、它將 Struts 動作與 Spring 框架耦合在一起。如果您想替換掉 Spring,那麼您必須重寫代碼。並且,由於 Struts 動作不在 Spring 的控制之下,所以它不能獲得 Spring AOP 的優勢。當使用多重獨立的 Spring 環境時,這種技術可能有用,但是在大多數情況下,這種方法不如另外兩種方法合適。
-->
方式二:使用 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的請求處理器,順便處理編碼問題。
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
<!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
<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(指向接口的實現類)
IUserServicesImpl裏面有一個iud(IuserDao接口引用)
他 ref id爲 userDaoImpl(指向接口的實現類) /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的請求處理器,根據struts配置的action中path屬性與applicationContext.xml中配置的bean的name屬性找到相應的action。
優缺點:
1、這種設計使 Struts 動作並不知道它正被 Spring 管理,並且使您能夠利用 Sping 的動作管理框架的所有優點。由於您的 Struts 動作注意不到 Spring 的存在,所以您不需要重寫您的 Struts 代碼就可以使用其他控制反轉容器來替換掉 Spring。
2、DelegatingRequestProcessor 方法的確比第一種方法好,但是仍然存在一些問題。如果您使用一個不同的 RequestProcessor,則需要手動整合 Spring 的 DelegatingRequestProcessor。添加的代碼會造成維護的麻煩並且將來會降低您的應用程序的靈活性。此外,還有過一些使用一系列命令來代替 Struts RequestProcessor 的傳聞。 這種改變將會對這種解決方法的使用壽命造成負面的影響。
-->
方式三:將 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) ;
}
}
代理
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
<!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
<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(指向接口的實現類)
IUserServicesImpl裏面有一個iud(IuserDao接口引用)
他 ref id爲 userDaoImpl(指向接口的實現類) /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 動作映射中註冊一個代理來實現。代理負責在 Spring 環境中查找 Struts 動作。由於動作在 Spring 的控制之下,所以它可以填充動作的 JavaBean 屬性,併爲應用諸如 Spring 的 AOP 攔截器之類的特性帶來了可能。
優缺點:
1、動作委託解決方法是這三種方法中最好的。 Struts 動作不瞭解 Spring,不對代碼作任何改變就可用於非 Spring 應用程序中。RequestProcessor 的改變不會影響它,並且它可以利用 Spring AOP 特性的優點。
2、動作委託的優點不止如此。一旦讓 Spring 控制您的 Struts 動作,您就可以使用 Spring 給動作補充更強的活力。例如,沒有 Spring 的話,所有的 Struts 動作都必須是線程安全的。如果您設置 標記的 singleton 屬性爲“false”,那麼不管用何種方法,您的應用程序都將在每一個請求上有一個新生成的動作對象。您可能不需要這種特性,但是把它放在您的工具箱中也 很好。您也可以利用 Spring 的生命週期方法。例如,當實例化 Struts 動作時, 標記的 init-method 屬性被用於運行一個方法。類似地,在從容器中刪除 bean 之前,destroy-method 屬性執行一個方法。這些方法是管理昂貴對象的好辦法,它們以一種與 Servlet 生命週期相同的方式進行管理
-->