Struts2.2.1整合Spring3.0的两种步骤

Struts2.2.1整合Spring3.0的两种方法
首先让spring加入到web应用中,在web应用中一般是启动的时候初始化sping容器。我们知道servletContextListener可以做到这一点,该监听器在web应用启动时回调自定义方法--该方法就可以启动web容器。Sping提供了一个ContextLoaderListener该监听器实现了ServletContextListener接口,该类可以作为监听器使用。它在创建使自动查找web-inf下的applicationContext.xml配置文件。;

第一中整合方法:让Spring接管struts的业务控制器(也就是Action),换句话说就是让struts的action纳入spring的管理中。
  我们知道Struts2的主要流程:先是请求到达Filter(也就是中央控制器),中央控制器通过解析struts.xml文件获取该请求是到哪一个业务控制器(也就是业务action),再通过反射创建这个业务控制器,我们这种整合就是让action的创建工作不再让struts的中央控制器去创建,而是用spring去创建,struts的中央控制器直接到spring的工厂中取Action即可。下面是具体的实例:


注意:此种方法需要引进spring的插件:struts2-spring-plugin-2.2.1.jar,Spring管理Action时一定要改变Action bean的scope不能将action的bean的scope设置为单例模式,需要改为:prototype 和 request两种。

此方法的缺点:
1,Spring管理Action,必须将每一个需要被管理的Action配置在applicationContext.xml文件中,而Struts的配置文件中也要配置每一个伪Action,配置两边未免冗余。
2,Action的业务逻辑租价接受容器注入,将导致代码的可读性降低。

1,Actin类:
    package com.dd.action;
    import com.dd.service.StrutsSpringLoginService;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    public class StrutsSpringLogin extends ActionSupport {
	private String username;
	private String password;
	private String tip;
	private StrutsSpringLoginService sss;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getTip() {
		return tip;
	}
	public void setTip(String tip) {
		this.tip = tip;
	}
	public StrutsSpringLoginService getSss() {
		return sss;
	}
	public void setSss(StrutsSpringLoginService sss) {
		this.sss = sss;
	}
	public String execute() throws Exception {
		if(sss.validateLogin(getUsername(),  
                    getPassword()).equals("success")){
			setTip("服务器提示:登录成功");
			ActionContext.getContext().getSession().put("username", 
               getUsername());
			return SUCCESS;
		}else{
			setTip("服务器提示:登录失败");
			return ERROR;
		}
	}
     }


2,service类:
   package com.dd.service;
   public class StrutsSpringLoginService {
	public String  validateLogin(String username,String password){
		if(username.equals("chenchaoyang") ||                  
                          password.equals("chenchaoyang")){
			return "success";
		}else{
			return "error";
		}
	}
   } 


3,配置文件strut-spring.xml(注:该文件应该用incluce标签包含到struts.xml文件中去)
   <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts> 
    <!-- 配置的package的name不能和主文件struts中的package名称相同 -->
	<package name="struts-spring" extends="struts-default">
	   <!-- 注意该Action的class属性值并不是一个具体的类,而是一个伪类,它表示的是spring配置文件中id为strutsSpringLogin的配置bean
	                      这就是struts2与Spring第一种配置的关键配置点
	    -->
	   <action name="strutsSpringLogin" class="strutsSpringLogin">
	      <result name="success">/strutsSpringLoginSuccess.jsp</result>
	      <result name="error">/strutsSpringLoginError.jsp</result>
	   </action>
	</package>
</struts>    


4,applicationContext.xml配置文件:
    <bean id="strutsSpringLogin" class="com.dd.action.StrutsSpringLogin">
        <property name="sss" ref="strutsSpringLoginService"></property>
    </bean>
    <bean id="strutsSpringLoginService"         
           class="com.dd.service.StrutsSpringLoginService">
    </bean>

5,登录页面:
   <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body><%--struts标签key对应的是国际化资源文件中的key --%>
    <s:form action="strutsSpringLogin">
       <s:textfield name="username" key="user"></s:textfield>
       <s:textfield name="password" key="pass"></s:textfield>
       <s:submit key="login"></s:submit>
    </s:form>
  </body>
</html>


6,登录成功页面:
   <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body>
    strutsSpring登录成功
    <s:property value="tip"/>
      </body>
</html>


7,登录失败页面
   <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s"  uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body>
    strutsSpring登录失败
    <s:property value="tip"/>
  </body>
</html>




二:struts,spring的第二种整合方法:spring的自动装配。
     所谓自动装配就是让spring插件自动将业务逻辑组建注入struts2的Action中,而无需使用ref显示指定以来Bean,spring容器会自动检查xml配置文件内容,为主调bean注入依赖bean,自动装配可以减少配置文件的工作量,但会减低依赖关系的透明性和清晰性。通过使用自动装配,可以让spring插件自动将业务逻辑组建注入struts2的action中。

下面是实例:
1,Action类;
package com.dd.action;
import com.dd.service.StrutsSpringAutoWireLoginService;
import com.dd.service.StrutsSpringLoginService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class StrutsSpringAutoWireLogin extends ActionSupport {
	private String username;
	private String password;
	private String tip;
	private StrutsSpringAutoWireLoginService sss;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getTip() {
		return tip;
	}
	public void setTip(String tip) {
		this.tip = tip;
	}
	public StrutsSpringAutoWireLoginService getSss() {
		return sss;
	}
	public void setSss(StrutsSpringAutoWireLoginService sss) {
		this.sss = sss;
	}
	public String execute() throws Exception {
		if(sss.validateLogin(getUsername(), getPassword()).equals("success")){
			setTip("服务器提示:登录成功");
			ActionContext.getContext().getSession().put("username", getUsername());
			return SUCCESS;
		}else{
			setTip("服务器提示:登录失败");
			return ERROR;
		}
	}
}


2,service
package com.dd.service;
public class StrutsSpringAutoWireLoginService {
	public String  validateLogin(String username,String password){
		if(username.equals("chenchaoyang") || password.equals("chenchaoyang")){
			return "success";
		}else{
			return "error";
		}
	}
}




3,struts的配置文件
    <!-- 配置的package的name不能和主文件struts中的package名称相同 -->
	<package name="struts-spring" extends="struts-default">
	   <!-- 注意该Action的class属性值并不是一个具体的类,而是一个伪类,它表示的是spring配置文件中id为strutsSpringLogin的配置bean
	                      这就是struts2与Spring第一种配置的关键配置点
	    -->
	   <action name="strutsSpringLogin" class="strutsSpringLogin">
	      <result name="success">/strutsSpringLoginSuccess.jsp</result>
	      <result name="error">/strutsSpringLoginError.jsp</result>
	   </action>
	   <!-- 下面的Action是采用自动装配的struts和spring整合,注意自动装配的方式配置action的class是真实的类,而不是伪类,切这个action依旧是spring来创建的。 -->
	   <action name="strutsSpringAutoWireLogin" class="com.dd.action.StrutsSpringAutoWireLogin">
	             <result name="success">/strutsSpringAutoWireLoginSuccess.jsp</result>
	   </action>
	</package>


4,spring的配置文件
<!-- 注意下面的这个bean是采用自动装配至action中的配置方式。它的id必须是action中的属性的名字 -->
    <bean id="sss" class="com.dd.service.StrutsSpringAutoWireLoginService"></bean>


5,用户入口页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body><%--struts标签key对应的是国际化资源文件中的key --%>
     这个实例是:struts spring已自动装配的方式整合
    <s:form action="strutsSpringAutoWireLogin">
       <s:textfield name="username" key="user"></s:textfield>
       <s:textfield name="password" key="pass"></s:textfield>
       <s:submit key="login"></s:submit>
    </s:form>
  </body>
</html>


6,登录成功页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body>
    strutsSpring自动装配登录成功
    <s:property value="tip"/>
      </body>
</html>