struts与spring整合方式有三种:
方式一:通过Spring的ActionSupport类实现。
方式二:通过Sping的DelegatingRequestProcessor类覆盖struts的requestprocessor实现。
方式三:通过Sping的DelegatingActionProxy类实现,将struts action管理委托给spring框架。
相同点:以上三种方式都需要在struts的配置文件struts-config.xml中注册spring的ContextLoaderPlugIn插件。即:
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>
</plug-in>
不同点:
方式一:使用Spring提供的ActionSupport类,只需要使用Action继承Spring的ActionSupport类,即可实现Spring与struts的整合,使用起来简单方便,但是struts的Action与Spring耦合在一起,并且Struts的Action不在spring的控制之中,这样如果更换别的IOC容器,或想使用Spring的AOP都是比较困难的,而且如果是多个动作放在一个Action中,则这种方式就无能为了了!
方式二:使用Spring的DelegatingRequestProcessor类,需要在Struts的配置文件中,使用DelegatingRequestProcessor代替Struts的RequestProcessor类,并在Spring的配置文件中动作映射对应的Bean,可以很方便的转换而不用修改代码,这种方式的缺点是依赖于Struts的RequestProcessor类。
方式三:使用Spring的DelegatingActionProxy类,需要在Struts的配置文件中,定义动作映射的type属性为DelegatingActionProxy而不是类的实际名称,并在Spring的配置文件中定义和Struts配置文件动作映射对应的Bean,这种方式和Struts耦合性最小。
注:三者中,使用Spring的DelegatingActionProxy类来整合Spring和Struts的方式最为强大和灵活。
方式三的实例
login.jsp
<% @ taglib uri = " http://struts.apache.org/tags-bean " prefix = " bean " %>
<% @ taglib uri = " http://struts.apache.org/tags-html " prefix = " html " %>
< html >
< head >
< title > JSP for LoginForm form </ title >
</ head >
< body >
< html:form action ="/login" >
username : < html:text property ="username" />< html:errors property ="username" />< br />
password : < html:password property ="password" />< html:errors property ="password" />< br />
< html:submit />< html:cancel />
</ html:form >
</ body >
</ html >
/StrutsLoginDemo/WebRoot/WEB-INF/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 ="loginForm" type ="com.qdu.sun.struts.form.LoginForm" />
</ form-beans >
< global-exceptions />
< global-forwards />
< action-mappings >
< action
attribute ="loginForm"
input ="/login.jsp"
name ="loginForm"
path ="/login"
scope ="request"
type ="org.springframework.web.struts.DelegatingActionProxy" >
< forward name ="failed" path ="/fail.jsp" />
< forward name ="success" path ="/success.jsp" />
</ action >
</ action-mappings >
< message-resources parameter ="com.qdu.sun.struts.ApplicationResources" />
< plug-in className ="org.springframework.web.struts.ContextLoaderPlugIn" >
< set-property property ="contextConfigLocation" value ="/WEB-INF/applicationContext.xml" />
</ plug-in >
</ struts-config >
/StrutsLoginDemo/WebRoot/WEB-INF/applicationContext.xml
< beans
xmlns ="http://www.springframework.org/schema/beans"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" >
< bean id ="login" class ="com.qdu.sun.struts.BO.LoginBO" />
< bean name ="/login"
class ="com.qdu.sun.struts.action.LoginAction" >
< property name ="loginBean" >
< ref bean ="login" />
</ property >
</ bean >
</ beans >
/StrutsLoginDemo/src/com/qdu/sun/struts/action/LoginAction.java
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.qdu.sun.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.qdu.sun.struts.BO.LoginBO;
import com.qdu.sun.struts.form.LoginForm;
/**
* MyEclipse Struts
* Creation date: 08-05-2008
*
* XDoclet definition:
* @struts.action path="/login" name="loginForm" input="/login.jsp" scope="request" validate="true"
* @struts.action-forward name="failed" path="/fail.jsp"
* @struts.action-forward name="success" path="/success.jsp"
*/
public class LoginAction extends Action {
/*
* Generated Methods
*/
/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
private LoginBO loginBean;
public LoginBO getLoginBean() {
return loginBean;
}
public void setLoginBean(LoginBO loginBean) {
this .loginBean = loginBean;
}
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form; // TODO Auto-generated method stub
LoginBO login = getLoginBean();
if (login.validate(loginForm.getUsername(), loginForm.getPassword()))
{
request.setAttribute( " username " , loginForm.getUsername());
return mapping.findForward( " success " );
}
else
return mapping.findForward( " failed " );
}
}